cat과 '>'의 차이점은 파일을 0으로 만듭니다.

cat과 '>'의 차이점은 파일을 0으로 만듭니다.

이 두 명령이 파일을 0으로 만드는 방법에 차이점이 있습니까? 후자가 전자보다 더 짧은 방법입니까? 뒤에서 무슨 일이 일어나는가?

둘 다

$ cat /dev/null > file.txt

$ > file.txt 

생산하다

-rw-r--r--  1 user  wheel  0 May 18 10:33 file.txt

답변1

cat /dev/null > file.txt고양이의 쓸모없는 사용.

기본적으로 아무것도 출력 cat /dev/null되지 cat않습니다. 예, 작동합니다. 하지만 외부 프로세스에 대한 불필요한 호출을 유발하기 때문에 많은 사람들이 눈살을 찌푸립니다.
이것은 흔하기 때문에 일어나는 일 중 하나입니다.

just를 사용하면 > file.txt대부분의 쉘에서 작동하지만 완전히 이식 가능하지는 않습니다. 완전한 이식성을 원한다면 다음이 좋은 옵션입니다.

true > file.txt
: > file.txt

:및/또는 true출력 데이터도 아니고 쉘 내장형 cat( 외부 유틸리티)이므로 더 가볍고 "적절"합니다.

 

고쳐 쓰다:

tylerl이 그의 의견에서 언급했듯이 구문도 있습니다 >| file.txt.

대부분의 쉘에는 통과를 방지하는 설정이 있습니다 >. 대신 이를 사용해야 합니다 >|. 이는 실제로 첨부하려고 할 때 사람의 실수를 방지하기 위한 것입니다 >>. 를 사용하여 이 동작을 켤 수 있습니다 set -C.

따라서 파일을 자르는 가장 간단하고 적합하며 이식 가능한 방법은 다음과 같습니다.

:>| file.txt

답변2

이식성 측면에서:

                      Bourne POSIX  zsh    csh/tcsh  rc/es  fish
> file                Y      Y      N(1)   N(1)      N      N
: > file              N/Y(2) Y(3)   Y      Y(4)      N(5)   N(5)
true > file           Y(5)   Y      Y      Y(5)      Y(5)   Y(5)
cat /dev/null > file  Y(5)   Y      Y(5)   Y(5)      Y(5)   Y(5)
eval > file           Y(3,8) Y(3)   Y      Y(6)      Y      Y
cp /dev/null file (7) Y(5)   Y      Y(5)   Y(5)      Y(5)   Y(5)
printf '' > file      Y(5)   Y      Y      Y(5)      Y(5)   Y

노트:

  1. in sh또는 ksh에뮬레이션을 제외하고, 명령이 없는 리디렉션의 경우 zsh에서는 기본 명령이 가정되며( cat그렇지 않은 경우 stdin 리디렉션의 경우에만 호출기) NULLCMD 및 READNULLCMD 변수를 사용하여 조정할 수 있습니다. 이는 다음과 같은 기능에서 영감을 얻었습니다.(t)csh
  2. ::UnixV7에서는 리디렉션이 주석 리더와 빈 명령 사이에서 해석되기 때문에 처음에는 수행되지 않습니다 . 나중에 모든 내장 함수와 마찬가지로 리디렉션이 실패하면 셸을 종료합니다.
  3. :eval특수 내장 함수 로 리디렉션이 실패하면 쉘을 종료합니다( bashPOSIX 모드에서만 실행됨).
  4. 흥미롭게도 에는 빈 레이블(for ) (t)csh이 정의되어 있으므로 거기에 분기가 있게 됩니다. 리디렉션이 실패하면 셸을 종료합니다.gotogoto ''
  5. 해당 명령을 사용할 수 없는 경우 $PATH( :일반적으로 그렇지 않음; true, 및 일반적으로 (POSIX cat에서 필요함)).cpprintf
  6. 리디렉션이 실패하면 셸을 종료합니다.
  7. 그러나 일부 구현(예: GNU)은 file존재하지 않는 파일을 가리키는 경우 심볼릭 링크 생성을 거부합니다.cp
  8. Bourne 쉘의 초기 버전하지만 내장 기능의 리디렉션은 지원되지 않습니다.

가독성 측면에서:

(이 부분은 매우 주관적입니다.)

  • > file. 이것은 >팁이나 댓글과 너무 비슷해 보입니다. 또한, 이 글을 읽을 때 제가 묻고 싶은 질문은 (대부분의 쉘이 같은 문제에 대해 불평할 것입니다)입니다.어떤 출력을 리디렉션하려고 합니까?.
  • : > file. :무작동 명령을 호출했습니다. 따라서 이를 직접 읽어 빈 파일을 생성합니다. 그러나 이것도 :쉽게 놓치거나 힌트로 받아들일 수 있습니다.
  • true > file:부울 값은 리디렉션이나 파일 콘텐츠와 어떤 관련이 있습니까? 이것은 무엇을 의미 하는가?이 인용문을 읽었을 때 가장 먼저 떠오른 생각은 다음과 같습니다.
  • cat /dev/null > file./dev/null에 연결되어 있나요 file? cat일반적으로 파일 내용을 덤프하는 명령으로 간주되지만 여전히 의미가 있습니다.덤프 내용이것파일을 비우세요file, 말하기가 약간 복잡하지만 cp /dev/null file여전히 이해할 수 있습니다.
  • cp /dev/null file. 콘텐츠 복사빈 파일도착하다 file. cp기본적으로 어떻게 수행되는지 모르는 사람은 장치를 만들려고 한다고 생각할 수도 있지만 이는 의미가 file있습니다 null.
  • eval > file또는 eval '' > file. 아무것도 실행하지 않고 출력을 file. 이상하게도 이것은 일반적인 관용구가 아닙니다.
  • printf '' > file: 분명한인쇄파일에 아무것도 없습니다. 나에게 가장 의미있는 것.

성능면에서

차이점은 내장 쉘을 사용하는지 여부입니다. 그렇지 않은 경우 프로세스를 분기하고 명령을 로드하고 실행해야 합니다.

eval모든 쉘에 구축이 보장됩니다. :가능한 모든 곳에서 내장됩니다(Bourne/csh가 좋아함). trueBourne과 같은 쉘에만 내장됩니다.

printf가장 현대적인 Bourne형 쉘과 fish.

cp그리고 cat일반적으로 내장되어 있지 않습니다.

이제 cp /dev/null file쉘 리디렉션이 호출되지 않으므로 다음과 같습니다.

find . -exec cp /dev/null {} \;

다음보다 더 효율적입니다.

find . -exec sh -c '> "$1"' sh {} \;

(반드시 더 나은 것은 아니지만:

find . -exec sh -c 'for f do : > "$f"; done' sh {} +

).

몸소

개인적으로 저는 Bourne 같은 쉘을 사용하고 : > file지금은 Bourne 같은 쉘 외에는 아무것도 사용하지 않습니다.

답변3

한 번 살펴보고 싶을 수도 있습니다 truncate. 파일을 자르는 것입니다.

예를 들어:

truncate --size 0 file.txt

를 사용하는 것보다 이것이 더 나을 수도 있습니다 true > file.txt.

그러나 내 주요 요점은 다음과 같습니다. truncate파일을 자르는 데 사용되는 반면 >를 사용하면 파일이 잘리는 부작용이 있습니다.

답변4

나는 이것이 더 깔끔해 보이고 누군가 실수로 Return 키를 누른 것처럼 보이지 않기 때문에 이것을 좋아하고 자주 사용합니다.

echo -n "" > file.txt

그것도 내장되어 있어야겠죠?

관련 정보