我在我的主目录中本地安装了一堆应用程序。为了让它们在全球范围内可用,我将它们添加PATH
到.bashrc
:
PATH="$PATH:/home/user/apps/app1/bin"
PATH="$PATH:/home/user/apps/app2/bin"
PATH="$PATH:/home/user/apps/appn/bin"
我怎样才能设置它,这样我就不必添加每个新的?我正在尝试这个,但它不起作用:
PATH="$PATH:/home/user/apps/*/bin"
注意:我知道我可以用循环添加它们,但我也担心我的PATH
变量会变得太大,我想知道是否可以以某种方式对其进行通配符。
通配符不会被扩展
$PATH
,不会。根据bash 手册,PATH 是:(我的重点)。
来自另一个方向,手册的命令搜索和执行部分说,部分:
...(我的重点)——它没有提到对路径元素进行的任何特殊处理,只是它们应该是目录(原样)。
我不确定 bash 变量大小的限制是什么;我怀疑它是可用的内存。PATH 不需要导出,但很多人会这样做;如果它被导出,它需要与其他环境变量和参数一起适应
getconf ARG_MAX
(参考:https ://unix.stackexchange.com/a/124422/117549 )。一个大的 PATH 目录不应该引起太多的性能开销,因为 bash 使用哈希表来记住以前找到的命令的位置(每个会话)。如果您在将每个单独的应用程序目录添加到 PATH 时确实遇到了限制(视觉或技术),我建议您在 PATH 中添加一个“符号链接”目录,然后在其中链接来自各种应用程序的所需可执行文件。
我为此使用了一些解决方案:
1.使用
find
动态生成$PATH
为此,我使用了一些类似但略有修改的方法。假设您有以下结构:
我们可以...
一个。将现有的apps/*/bin/文件夹添加到
$PATH
这将搜索/apps/*中的任何bin/目录,并将它们添加到shell 加载时,跳过任何没有bin/子目录的目录。
$HOME
$PATH
产生:
湾。添加任何somedir/*/bin/到
$PATH
...无论somedir/中的每个文件夹是否实际上都有一个bin/子目录。这意味着,对于上述目录结构,即使apps/blah/bin将被添加到
$PATH
-- 即使它不存在!当您的某个目录当前没有bin/子目录时,这很有用,但将来很有可能,并且您不想重新加载 shell 以便在您
$PATH
之后将其添加到您的创造它。产生:
由于命令查找会短暂地尝试查找不存在的目录,并且将不存在的目录添加到我
$PATH
的 .2.
stow
用于生成可执行文件的符号链接stow
正是为此目的而创建的。我目前正在使用此设置将我的所有 dotfiles 存储在 git repo 中并将它们复制到我的主目录:)如果您的目录结构如下:
并且您希望bar/bin/*和foo/bin/*中的所有文件都链接到bin/中,您可以运行:
注意:我
--restow
用于修剪,因为它会在重新创建新符号链接之前先删除所有旧符号链接这会产生:
然后你可以简单地将somedir/bin/添加到你的
PATH
更
stow
容易使用如果
那么你可以使用一个稍微简单的
stow
命令:这基本上是在“apps”文件夹中查找名为“foo”和“bar”的“packages”,并使用 symlinks 将这两个包的全部内容复制到当前目录。因此,如果您在apps/foo/和apps/bar/中的所有内容都是一个bin/文件夹,那么这会在当前目录中生成一个bin/文件夹,其中包含指向apps/foo/bin/中所有文件的链接,并且应用程序/栏/bin/。
但是,如果除了一个bin/目录之外,您在apps/foo/和apps/bar/中还有很多其他文件/文件夹,那么它也会在您的主文件夹中重新创建所有这些文件/文件夹,这可能是不可取的,你应该坚持第一个例子。
stow
https://www.gnu.org/software/stow/manual/html_node/Installing-Packages.html
添加
/home/user/apps/*/bin
到$PATH
意味着在路径为的目录中搜索可执行文件/home/user/apps/*/bin
(完全有效的路径,没有什么可以阻止*
字符¹在 Unix 上的文件或目录的名称中使用),您可以添加路径匹配的目录/home/user/apps/*/bin
当时写作使用:在 zsh 中,
$PATH
变量与$path
csh 中一样与数组绑定,并且-/
glob 限定符可用于限制扩展为目录类型的文件(或符号链接到目录),以及N
nullglob您还可以发出 a
typeset -U path
来删除重复项(U
表示唯一)。在
fish
中,其中$PATH
作为数组公开,并且类似 nullglob 的行为适用于 中使用的 globset
:(但不限于目录类型的文件)。
POSIXly,你总是可以这样做:
无论如何,如果稍后将更多目录添加到 /home/user/apps/ 中,它们将不会自动出现在
$PATH
.在 ksh93 中,您可以使用规则来实现这种魔法:
$PATH
每次引用时都会计算的值。在 zsh 中,您可以在每个提示之前使用
precmd()
钩子或bash
using重新计算它$PROMPT_COMMAND
。¹ 或除 NUL 以外的任何字符
/
,甚至是非字符。