由于我是 zsh 的新手,据我所知,我的整个概念可能是错误的,但我注意到当我从如下命令zcompile
运行它时,我的系统找不到它:find
find . -type f -not -name "*.zwc" -exec zcompile {} \;
我得到的错误是:
find: zcompile: No such file or directory
但我可以zcompile
从提示符处运行并且没有.zwc
问题。有人知道为什么批处理find
不起作用吗?
答案1
zcompile
是一个zsh
只能从 shell 内部使用的 shell 内置命令,find
是与 shell 分开的命令,因此无法工作。
zsh
全局变量可以find
在这里轻松替换:
set -o extendedglob # for ^, best in ~/.zshrc
for file (./**/^*.zwc(N.)) zcompile $file
(这里省略隐藏文件和隐藏目录中的文件,这可能是更好的选择;如果不添加D
glob 限定符)。
如果您想使用find
,则需要find
输出列表,并且 shell 检索该列表以将其传递给其zcompile
内置函数。就像是:
find . ! -name "*.zwc" -type f -print0 |
while IFS= read -rd '' file; do
zcompile $file
done
或者您需要find
启动一个shell 来在找到的文件上zsh
运行它:zcompile
find . ! -name "*.zwc" -type f -exec zsh -c '
for file do
zcompile $file
done' zsh {} +
(请注意,某些find
实现(包括 GNU )具有glob 没有的find
限制,因为它们不会匹配在当前语言环境中不形成有效字符的字节序列)。zsh
*