파일을 작성하는 쉘 명령이없는 이유는 무엇입니까?


27

주의하십시오 :

나는 하지 명령 줄에서 파일을 만드는 방법을 물어!


나는 touch주된 목적이 다른 것임을 주목하지 않고 몇 년 동안 파일을 만드는 데 사용 해 왔습니다 . 커맨드 라인에서 파일을 만들고 싶다면 다음과 같은 많은 가능성이 있습니다.

touch foo.bar
> foo.bar
cat > foo.bar
echo -n > foo.bar
printf '' > foo.bar

그리고 더 많은 것이 있다고 확신합니다.

그러나 사실 위의 명령 중 어느 것도 실제로 파일을 작성하도록 설계되지 않았습니다. 예를 man touch들어이 명령은 파일 타임 스탬프를 변경하기위한 것입니다. 왜 유닉스 (또는 리눅스)만큼 완벽한 OS가 파일을 만들기위한 명령을 가지고 있지 않은가?


35
이미 존재하는 도구로 수십 가지 방법으로 수행 할 수있는 명령을 추가하기 위해 시스템을 어지럽히는 이유는 무엇입니까?
Michael Kohne

4
streams / stdin / out에서 파일을 읽는 명령이없는 이유는 무엇입니까? 모든 사람들은 cat연합을 위한 명령을 사용합니다 !
SF.

2
@MichaelKohne, 나는 당신의 요점을보고, 모든 적절한 존중, 나는 그것에 문제가 있습니다. 이 방법을 사용하면 시스템을 복잡하게 만드는 많은 명령이 있습니다. 왜 사용 more하면 less무엇보다 더 수행 more할!? 또는 dirls. 그럼에도 불구하고 호환성 문제를 알고 있습니다.
Pouya

9
more의 생성 이전 less. less의 단점을 해결하기 위해 특별히 만들어졌습니다 more. more이전 버전과의 호환성을 위해 여전히 존재합니다. dir그리고 ls대부분의 의도와 목적을 위해 동일한 실행 파일입니다-소수의 바이트에서만 다릅니다. 파일 작성을 위해 특별히 고안된 새로운 도구 는 기존 도구 보다 성능 이 떨어 지므로 lessvs 의 경우와 같이 개선되지 않고 회귀가 more됩니다.
lanzz

1
또한 우리는 레거시를 살펴볼 필요가 있습니다. Unix는 각 바이트를 계산할 때 만들어졌습니다. 기존 유틸리티로 수행 할 수있는 작업에 대한 유틸리티를 작성하는 이유는 무엇입니까?
Thomas

답변:


38

명령 줄이나 셸 스크립팅에서 즉시 내용을 채우지 않는 빈 파일을 만들 필요가 거의 없기 때문입니다.

한 번에 파일을 작성할 수 있으면 먼저 파일을 작성한 다음 I / O 재 지정을 사용하여 파일에 쓰면 아무런 이점이 없습니다.

실제로 빈 파일을 만들고 남기고 싶은 경우에는 > "${file}"더 짧고 우아 할 수 없다고 주장합니다 .

TL; DR : 빈 파일을 만드는 것이 가장 자주 사용되지 않기 때문에 존재하지 않으며 이미이 목표를 달성하는 데 사용할 수있는 수많은 옵션이있는 경우.

참고로, touch파일이 존재하지 않는 경우에만 작동하는 반면 리디렉션을 사용하는 옵션은 파일이 존재하더라도 항상 파일을 자릅니다 (기술적으로는 솔루션이 동일하지 않음). > foo그것은을 절약 할 수 있기 때문에 선호되는 방법입니다 fork그리고 echo -n그것은 매우 인자를 취하지이기 때문에 일반적으로 피해야한다.


1
파일을 만들고 I / O 도구를 사용하는 것에 대한 요점을 찾았습니다. 고맙습니다.
Pouya

1
@FaheemMitha 예 ( >>). OP를 사용하여 제공된 예제를 참조하고있었습니다 >. 파일을 작성하는 중이거나 파일이 있으면 NOOP가 없으면 추가하는 것은 쓸모가 없습니다.
Adrian Frühwirth

1
기존 파일을 덮어 쓰 noclobber도록 설정 하지 않아도 >됩니다.
Ouki

1
@Ouki AFAIK, 기본 동작이 아닌 설정은 다른 시스템이 아닌 다른 시스템에 설정되어 있다는 것을 잊어 버릴 수 있으며 alias rm='rm -i'대신 대신 만드는 alias rmi='rm -i'것이 나쁜 생각 과 같은 방식으로 문제를 일으킬 수 있습니다.
Agi Hammerthief

1
@mikeserv > .file는 커맨드 라인만으로도 :.
Charles Duffy

16

Adrian Frühwirth의 답변이 옳습니다. 방금 파일을 만들기 위해 특별히 작성된 명령이 있다는 것을 추가하고 싶었습니다 mktemp.

NAME
       mktemp - create a temporary file or directory

SYNOPSIS
       mktemp [OPTION]... [TEMPLATE]

DESCRIPTION
       Create a temporary file or directory, safely, and print its name.  TEM
       PLATE must contain at least 3 consecutive 'X's in last  component.   If
       TEMPLATE is not specified, use tmp.XXXXXXXXXX, and --tmpdir is implied.
       Files are created u+rw, and directories  u+rwx,  minus  umask  restric
       tions.

물론, mktemp특정 이름으로 파일을 만드는 것이 아니라 단순히 파일 을 만드는 것 입니다. 그러나 이미 말했듯이 주어진 이름으로 파일을 작성하는 명령을 제공하는 훨씬 더 효율적이고 우아한 방법이 무의미합니다.

말했다, 당신은 또한이 truncatefallocate모두 그 본질적 목적 파일을 만드는 것입니다. 그들은 더 정교한 접근 방식을 가지고 있습니다. > file보다 나은 방법이 없기 때문에 어떤 일을하는 간단한 프로그램은 결코 없을 것 > file입니다.


11

대부분의 기본 쉘 도구는 특별한 목적을 위해 설계 되지 않았습니다 . 대부분의 기본 쉘 도구는 다른 사람과 상호 작용하여 목적을 달성 하도록 설계되었습니다 . 또는 목표를 달성하기 위해 도구를 결합하는 방법에 관계없이 대부분의 도구는 하나의 매우 기본적인 작업 만 수행한다고 할 수 있습니다.

: >./file

빈 파일이 생성됩니다. 또는 기존 파일을 원하는대로 자릅니다. 당신은 할 수 있습니다 :

set -o noclobber

다음과 같은 경우가 아니면 후자의 경우를 피할 수 있습니다.

: >|./file

다음과 비슷한 동작을 얻을 수 있습니다 touch.

: >>./file
: >>|./file

그거 빼고 : 이 수정되지 않기 때문에 파일의 modtime 업데이트되지 않습니다.

데모

mkdir test ; cd $_
touch touch.file 
: >null.file
echo >echo.file
ls -l

산출

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file

터치하지

: >>|./echo.file
ls -l 

산출

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file

기본적으로 echo는 \n줄의 끝에 추가합니다 . 시도 echo -n >echo-n.file(size = 0) 및 echo -e >echo-e.file(size = 1)
Thomas

@Thomas '표준 출력에 쓸 문자열입니다. 첫 번째 피연산자가 -n이거나 피연산자 중 하나에 백 슬래시 ( '\') 문자가 포함 된 경우 결과는 구현 정의됩니다. XSI 호환 시스템에서 첫 번째 피연산자가 -n이면 옵션이 아닌 문자열로 처리됩니다. 다음 문자 시퀀스 '... 인수의 내 XSI를 준수하는 시스템에 인식하고 있습니다 pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
mikeserv

충분히 공평하고 링크에 감사드립니다. 제 의견은 어쨌든
Thomas

2
예, 정말 죄송합니다. 어쨌든 내 의견에 대답의 요점이 누락되었습니다. 미안합니다.
Thomas

1
일반화하려는 유닉스 경향의 예는 파일의 내용을 표시하는 명령을라고 cat합니다. 하나의 명령으로 여러 파일을 표준 출력으로 연결하는 명령을 작성할 수있는 이유는 무엇입니까?
200_success

1

이 유틸리티 install는 실제로 파일을 작성하도록 설계되었습니다! 파일의 내용을 통해 /dev/stdin(대부분의 경우 Linux의 대부분의 경우 /proc마운트 해야 함 ) 다른 소스 파일을 제공 할 수 있습니다. 소유권과 권한을 설정할 수 있습니다.

echo "New file" | install -o 0644 -m 452452 -g dumbass /dev/stdin /var/www/index.html

바보 같은 예입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.