如何在 zsh 中使用 PATH 变量作为 find 的起点

如何在 zsh 中使用 PATH 变量作为 find 的起点

我尝试使用 $PATH 作为输入来查找由我的路径定义的文件。这是我的尝试:

find ${PATH//:/ } -iname "*chrome*"

这里我用空格替换了所有:内容PATH,因此起点列表看起来就像您手动输入时一样。问题是,这是响应:

find: ‘/home/martin/bin /home/martin/.local/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /snap/bin’: No such file or directory

该变量被解释为整个字符串,而不是多个以空格分隔的路径。

可以使用 xargs 解决这个特殊问题,如下所示:

echo $PATH | xargs -d: -Ix find x -iname "*chrome*"

我仍然很好奇如何让第一次尝试成功。我敢打赌,从性能上来说,那个也更好。我在我的系统上使用 zsh。谢谢

答案1

看起来你正在使用像 zsh 这样的 shell,它禁用变量扩展上的分词。如果您确实在使用 zsh,那么您需要通过模拟sh( emulate sh) 或使用来强制扩展${=PATH//:/ }

$ printf "%s\n" ${PATH//:/ }
/usr/local/sbin /usr/local/bin /usr/bin
$ printf "%s\n" ${=PATH//:/ }
/usr/local/sbin
/usr/local/bin
/usr/bin
$ (emulate sh; printf "%s\n" ${PATH//:/ })
/usr/local/sbin
/usr/local/bin
/usr/bin

如果你确实在使用 bash,请检查你的 IFS:

$ (IFS=; printf "%s\n" ${PATH//:/ })
/usr/local/sbin /usr/local/bin /usr/bin
$ (IFS=; unset IFS; printf "%s\n" ${PATH//:/ })
/usr/local/sbin
/usr/local/bin
/usr/bin

设置IFS为空字符串会禁用 bash 中的分词功能。您可以取消设置 IFS获取默认值并重新启用分词。

相关内容