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


38

看起来当在$ PATH中添加目录时,不会递归添加其子目录。那我能做到吗?还是有不支持此功能的原因?


5
你到底为什么需要那?
Alex

10
@alex:您为什么认为没有必要?
蒂姆(Tim)

4
@Tim不被“一般”支持的原因是它存在安全风险,通常不需要。如果您将目录递归地添加到路径中,那么谁知道其中可能卡住了什么……将使审核变得困难得多。
xenoterracide

4
@Tim:这是一件非常令人惊讶且与众不同的事情,这就是为什么。
alex

8
@alex对于bin目录中的子目录怎么办?我很想在bin文件夹的目录中组织脚本。
安迪

Answers:


19

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

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

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

这可能是一个更好的解决方案遵循吉尔的答案和使用平放


6
警告:这个答案在技术上是正确的,但正如alex和xenoterracide所指出的那样,这是一件疯狂的,不安全的事情,您在使用此工具之前一定要三思。
卡莱布

2
请在您的回答中添加一条警告,说明为什么这在实践中不是一件好事,安全的事情。
卡莱布

3
我认为这不是特别危险;向其中添加随机目录$PATH很危险,但是添加子目录并没有明显恶化。但这通常是无用的,并且可能效率低下(有时甚至可能使您陷入环境大小限制)。
吉尔(Gilles)'所以

3
@Caleb:也许疯了,但是为什么不安全呢?如果某人有权在子目录中添加恶意可执行文件,则他也可以将其添加到父目录(即~/bin~/scripts),因此它们的安全性是相同的。
MestreLion,2015年

2
如果您在随机的人可以向您的计算机添加恶意文件的环境中工作,则存在安全风险~/scripts。我没有,其他任何人都不应该
oseiskar '16

21

通常的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)可以是在这方面是有用的。


4

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

因此,如果您的$PATHinclude文件/usr/local/bin(很可能是这样做的),则该文件夹中充满了符号链接(如ruby),这些符号链接指向找到运行ruby的代码的特定目录(如../Cellar/ruby/2.1.3/bin/ruby)。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.