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

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

참고:

그래요아니요명령줄에서 파일을 만드는 방법을 묻는 질문입니다!


나는 문서를 만드는 데 수년 동안 그것을 사용해 왔지만 touch그 주요 용도가 다른 용도라는 것을 알지 못했습니다. 명령줄에서 파일을 생성하려는 경우 여러 가지 가능성이 있습니다.

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

나는 더 많은 것이 있다고 확신합니다.

그러나 사실 위의 명령 중 어느 것도 실제로 파일 생성을 위해 설계된 것은 아닙니다. man touch이 명령은 파일 타임스탬프를 변경하는 데 권장됩니다 (예 : . Unix(또는 Linux)와 같은 완전한 운영 체제에는 왜 파일 생성을 위해 특별히 설계된 명령이 없습니까?

답변1

빈 파일을 만들 필요가 거의 없기 때문에 명령줄이나 셸 스크립트에 콘텐츠를 즉시 채우지 않기 때문이라고 말하고 싶습니다.

파일을 생성한 다음 I/O 리디렉션을 사용하여 한 단계로 수행할 수 있다면 파일에 쓰는 것은 전혀 이점이 없습니다.

정말로 빈 파일을 만들어 보관하고 싶은 경우에는 이보다 > "${file}"더 간단할 수 없다고 생각합니다.

긴 이야기 짧게: 빈 파일을 만드는 것은 일반적으로 쓸모가 없기 때문에 존재하지 않으며, 만약 있었다면 이를 달성하기 위한 수많은 옵션이 이미 있을 것입니다.

그건 그렇고, touch을 사용하는 것은 파일이 존재하지 않는 경우에만 작동하는 반면 리디렉션을 사용하는 옵션은 파일이 존재하더라도 항상 파일을 자릅니다(따라서 기술적으로 이러한 솔루션은 동일하지 않습니다). > foo저장하기 때문에 선호되는 방법이며 fork이식성 echo -n이 매우 낮기 때문에 일반적으로 피해야 합니다.

답변2

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작업은 특정 이름의 파일을 생성하는 것이 아니라 단지문서. 그러나 이미 말했듯이 특정 이름의 파일을 생성하는 더 효율적이고 우아한 방법이 많이 있으며 이에 대한 명령을 제공하는 것은 의미가 없습니다.

즉, 당신도 가지고 있습니다truncate그리고fallocate둘 다의 본질적인 목적은 파일을 생성하는 것입니다. 그들은 더 정교한 접근 방식을 가지고 있습니다. > fileNET보다 더 나을 수 없기 때문에 이를 수행할 수 있는 간단한 프로그램은 결코 없을 것입니다 > file.

답변3

대부분의 기본 쉘 도구는 그렇지 않습니다.디자인됨매우 특정한 목적을 위해. 가장 기본적인 쉘 도구는디자인됨목표를 달성하기 위해 다른 사람들과 상호 작용하십시오. 아니면 대부분의 도구는 목표를 달성하기 위해 어떻게 결합하든 상관없이 매우 기본적인 작업 하나만 수행한다고 말해야 할 수도 있습니다.

: >./file

그러면 빈 파일이 생성됩니다. 또는 필요한 경우 기존 파일을 자릅니다. 당신은 할 수 있습니다:

set -o noclobber

후자의 시나리오가 발생할 가능성을 방지하려면 다음을 제외하고:

: >|./file

다음과 유사한 동작을 얻을 수 있습니다 touch.

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

단, :파일이 수정되지 않았기 때문에 파일 수정 시간은 업데이트되지 않습니다.

데모 버전

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

답변4

이 유틸리티는 install실제로 파일 생성용으로 설계되었습니다! 파일의 내용을 전달 하거나 다른 소스 파일을 제공할 수 있습니다 /dev/stdin(그러나 대부분의 경우 Linux 버전에서는 설치가 필요합니다) . /proc소유권과 권한을 설정할 수 있습니다.

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

어리석은 예로서.

관련 정보