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