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

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

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

答案1

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

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

for d in /opt/*/bin; do PATH="$PATH:$d"; done

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

答案2

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

PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )

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

遵循 Gilles 可能是更好的解决方案回答并使用存放

答案3

不支持这一点的原因之一是 bin/ (和类似的)目录使用符号链接指向安装程序的实际可执行文件的特定目录。

因此,如果您$PATH包含/usr/local/bin(很可能会这样做),则该文件夹充满了符号链接(如ruby),它们指向运行 ruby​​ 的代码所在的特定目录(如../Cellar/ruby/2.1.3/bin/ruby)。

这就是为什么您不必在 ; 中指定每个可执行文件的文件夹$PATH。通常在 bin/ type 目录中找到的符号链接会为您处理该问题。

答案4

答案在 Mac OS 上对我不起作用,所以我找到了一种有效的方法:

export PATH=$PATH:$(find $HOME/apps -type d -maxdepth 1 | paste -sd ":" -)

我希望它有帮助!

笔记:这还包括文件夹本身。

相关内容