如何将目录的所有子目录设置为 $PATH?

Tim*_*Tim 48 path

看起来在将目录添加到 $PATH 时,它的子目录不会递归添加。那我可以这样做吗?或者是否有不支持的原因?

Gil*_*il' 32

通常的 unix 目录结构将应用程序文件按种类分类到目录中:bin用于可执行文件、lib用于库、doc用于文档等。那是它们安装在单独的目录中的时候;经常应用被分成几个目录(因此很多系统刚刚三个目录中$PATH/usr/local/bin/usr/bin/bin)。一个目录中同时包含可执行文件和子目录的情况很少见,因此不需要将目录的子目录包含在$PATH.

有时可能有用的是bin将给定目录的子目录的所有子目录包含在$PATH

for d in /opt/*/bin; do PATH="$PATH:$d"; done
Run Code Online (Sandbox Code Playgroud)

但是,很少这样做。当可执行文件位于非标准目录中时,通常的方法$PATH是在路径中的目录中创建符号链接,例如/usr/local/bin. 该stow实用程序(或xstow)可以是在这方面是有用的。


vsc*_*hum 30

使用 find 递归地添加它们,如下所示:

PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )
Run Code Online (Sandbox Code Playgroud)

警告:正如对问题的评论中所述,不鼓励这样做,因为它会带来安全风险,因为无法保证添加的目录中的可执行文件不是恶意的。

遵循吉尔斯的回答并使用stow可能是更好的解决方案

  • 警告:这个答案在技术上是正确的,但正如 alex 和 xenoterracide 所指出的那样,这是一件非常不安全的事情,在实际使用它之前你绝对应该三思而后行。 (7认同)
  • @Caleb:也许疯了,但为什么不安全?如果有人有权在子目录中添加恶意可执行文件,他也可以将它们添加到父目录(即`~/bin` 或`~/scripts`),因此它们的安全性是相同的。 (4认同)
  • 我不会认为它特别*危险*;将随机目录添加到 `$PATH` 是危险的,但添加子目录并没有明显更糟。但它通常*无用*,并且可能效率低下(有时甚至可能使您陷入环境大小限制)。 (3认同)
  • 请在您的答案中添加警告,说明为什么这在实践中不是一个好的、安全的做法。 (2认同)
  • 如果您在随机人员可以将恶意文件添加到您的 `~/scripts` 的环境中工作,则存在安全风险。我不,其他人也不应该 (2认同)
  • @oseiskar 这完全是不诚实和公然的圈套......在你的`$PATH` 中有一个自定义的脚本目录是 99% 有经验的用户所做的事情。Heck Ubuntu 甚至默认在 $PATH 中添加 `~/bin` 和 `~/.local/bin` 目录(如果存在)。绝对不建议在路径中从用户的家中添加单个目录。然后,如果您的路径中只有一个 `~/.local/bin` 文件夹,请彻底解释如何使用 `~/.local/bin/**` 来增加被恶意破坏的可执行文件的风险,而不是仅`~/.local/bin`。 (2认同)