파일을 작성하는 쉘 명령이없는 이유는 무엇입니까? 왔습니다 . 커맨드 라인에서

주의하십시오 :

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


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

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

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

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



답변

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

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

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

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

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


답변

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입니다.


답변

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

: >./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

답변

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

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

바보 같은 예입니다.