PATH(环境变量)中的通配符

php*_*_qq 4 bash path environment-variables

我在我的主目录中本地安装了一堆应用程序。为了使它们在全球范围内可用,我将它们添加PATH.bashrc

PATH="$PATH:/home/user/apps/app1/bin"
PATH="$PATH:/home/user/apps/app2/bin"
PATH="$PATH:/home/user/apps/appn/bin"
Run Code Online (Sandbox Code Playgroud)

我该如何设置才能不必添加每个新的?我正在尝试这个,但它不起作用:

PATH="$PATH:/home/user/apps/*/bin"
Run Code Online (Sandbox Code Playgroud)

注意:我知道我可以用循环添加它们,但我也担心我的PATH变量会变得太大,我想知道是否可以以某种方式使用通配符。

Jef*_*ler 6

通配符不会在$PATH, no 中扩展。根据bash 手册,PATH 是:

以冒号分隔的目录列表,shell 在其中查找命令

(我的重点)。

从另一个方向来看,手册的命令搜索和执行部分说,部分内容是:

如果该名称既不是 shell 函数也不是内置函数,并且不包含斜杠,Bash 将搜索 $PATH 的每个元素以查找包含该名称的可执行文件的目录

...(我的重点)——它没有提到对路径元素进行的任何特殊处理,只是说它们应该是目录(按原样)。

我暂时不确定 bash 变量的大小限制是多少;我怀疑它是可用内存。PATH不需要导出,但很多人都这样做;如果导出,则需要与其他环境变量和参数一起放入getconf ARG_MAX(参考:https: //unix.stackexchange.com/a/124422/117549)。大型 PATH 目录不应引起太多性能开销,因为 bash 使用哈希表来记住先前找到的命令(每个会话)的位置。

如果您在将每个单独的应用程序目录添加到 PATH 时确实遇到了限制(视觉或技术),我建议您向 PATH 添加一个“符号链接”目录,然后您可以在其中链接来自各个应用程序的所需可执行文件。

  • 如果您希望子进程看到“PATH”,则需要导出它。例如,如果希望脚本也能够在“/home/user/apps/app1/bin”中找到内容,或者如果您从编辑器或“less”等启动其他程序。默认的“$PATH” ` Bash 在我的 Debian 上设置的看起来是 `/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.`,适用于大多数情况,但它与我在 shell 的启动文件中设置的不一样。最后的“.”也有点有趣。 (3认同)