我尝试使用 $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
获取默认值并重新启用分词。