我认为以下两个命令会输出相同的内容,但它们不会:
命令 1:
找 。-name 文件名 -exec 打印 '{}' \;
命令 2:
找 。-name 文件名 -exec echo '{}' \;
实际上,Command 2 的工作原理与我预期的一样:它打印所有实例的相对路径filenameunder.
但是,对于Command 1 ,我在输出中得到的行数与Command 2得到的行数一样多,但不是给我路径,而是每行说:
find: print: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我也尝试删除 {} 的引号。
为什么第二个命令没有按我预期的那样工作?为什么它无法打印到每个实例的路径filename?
对比:
% whence -a print
print
% whence -a echo
echo
/bin/echo
Run Code Online (Sandbox Code Playgroud)
这表明print仅作为内置程序echo存在,而同时作为内置程序和可执行文件存在。(实际上,通过什么上面显示下去,print并且echo可能是别名,函数或保留字;使用whence -w看正是型内部对象的名称表示的。)
find是一个外部命令,所以它不能调用任何内置的 shell。如果您确实需要调用 shell 的内置函数,请显式调用 shell:
find . -name filename -exec zsh -c 'print "$0"' '{}' \;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我不认为你想要 zsh 的print内置:find's -printprimary 将完成这项工作,只有正确( zshprint内置扩展反斜杠)。
find . -name filename -print
Run Code Online (Sandbox Code Playgroud)
(你甚至可以省略-print这里,因为这-print是默认操作find未指定时。)
有一个echo外部可执行文件但没有调用的原因print是它echo是一个标准命令,因此即使对于想要在不通过 shell 的情况下调用它的程序,它也具有最大的可用性。相比之下,print是特定于 zsh 的,因此只有 zsh 脚本首先使用它。
(哦,在我的系统上,有一个print命令可以将文件发送到打印机。)