다음 두 명령이 동일한 결과를 출력할 것이라고 생각했지만 그렇지 않습니다.
명령 1:
찾다. -name 파일명-exec print '{}' \;
명령 2:
찾다. -name 파일 이름-exec echo '{}' \;
실제로,명령 2예상대로 작동합니다. filename
아래의 모든 인스턴스의 상대 경로를 인쇄합니다..
그러나명령 1출력에서 가능한 한 많은 줄을 얻습니다.명령 2, 그러나 경로를 제공하는 대신 각 줄에는 다음과 같이 표시됩니다.
find: print: No such file or directory
또한 {} 주변의 따옴표를 제거해 보았습니다.
두 번째 명령이 예상대로 작동하지 않는 이유는 무엇입니까? 왜 각 인스턴스의 경로를 인쇄하지 않습니까 filename
?
답변1
비교:
% whence -a print
print
% whence -a echo
echo
/bin/echo
print
이는 내장 프로그램으로만 존재하지만 echo
내장 프로그램과 실행 파일 모두로 존재 함을 나타냅니다 . (실제로 위에 표시된 것처럼 별칭, 함수 또는 예약어 print
가 될 수 있으며 이름이 나타내는 내부 객체의 유형을 정확히 확인하는 데 사용됩니다.)echo
whence -w
find
외부 명령이므로 내장 셸을 호출할 수 없습니다. 실제로 셸의 내장 함수를 호출해야 하는 경우 셸을 명시적으로 호출하세요.
find . -name filename -exec zsh -c 'print "$0"' '{}' \;
이 경우 zsh의 내장된 print
-in: 주요 기능이 작업을 올바르게 수행하는 것을 원하지 않는다고 생각합니다 (zsh의 내장 확장 백슬래시).find
-print
print
find . -name filename -print
( 작업이 지정되지 않은 경우 기본 작업 -print
이므로 생략할 수도 있습니다 .)-print
find
echo
외부 실행 파일이 존재하지만 호출되지 않는 이유 print
는 echo
표준 명령이기 때문에 쉘 없이 호출하려는 프로그램에서도 활용도가 극대화되기 때문이다. 대신 print
zsh에만 적용되므로 처음에는 zsh 스크립트만 사용합니다.
print
(아, 그리고 내 시스템에는 파일을 프린터로 보내는 명령이 있습니다 .)
답변2
find
"-exec"로 지정한 것과 일치하는 명령을 PATH에서 검색합니다. echo
실제로는 시스템의 바이너리입니다(저에게는 그랬습니다 /bin/each
).
print
대조적으로, 이는 시스템에 있는 바이너리가 아니라 쉘 내장입니다(찾아보세요).여기) 여기서 find를 실행할 수 없습니다.