我认为以下两个命令会输出相同的内容,但它们不会:
命令1:
寻找 。 -name 文件名 -exec print '{}' \;
命令2:
寻找 。 -name 文件名 -exec echo '{}' \;
实际上,命令2正如我预期的那样工作:它打印了filename
under的所有实例的相对路径.
然而,对于命令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
是一个外部命令,因此它不能调用任何内置的 shell。如果您确实需要调用 shell 的内置函数,请显式调用 shell:
find . -name filename -exec zsh -c 'print "$0"' '{}' \;
在这种情况下,我认为您不希望 zsh 的print
内置:find
的-print
主要功能能够正确完成这项工作(zshprint
内置扩展反斜杠)。
find . -name filename -print
(您甚至可以省略此处-print
,因为这是未指定操作时-print
的默认操作。)find
echo
存在外部可执行文件但没有被调用的原因print
是它echo
是标准命令,因此即使对于想要不通过 shell 调用它的程序,它也具有最大的可用性。相反,print
它是 zsh 特有的,因此只有 zsh 脚本首先使用它。
(哦,在我的系统上,有一个print
命令可以将文件发送到打印机。)
答案2
find
在 PATH 中搜索与您使用“-exec”指定的内容相匹配的命令。echo
实际上是您系统上的二进制文件(对我来说是/bin/each
)。
print
相比之下,它不是位于您系统上的二进制文件,而是 shell 内置的(查找它这里)其中 find 无法为您执行。