find -exec on zsh:echo 按预期工作, print 不工作

find -exec on zsh:echo 按预期工作, print 不工作

我认为以下两个命令会输出相同的内容,但它们不会:

命令1:

寻找 。 -name 文件名 -exec print '{}' \;

命令2:

寻找 。 -name 文件名 -exec echo '{}' \;

实际上,命令2正如我预期的那样工作:它打印了filenameunder的所有实例的相对路径.

然而,对于命令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 无法为您执行。

相关内容