为什么符号链接是 opt 中可执行文件的首选解决方案,而不是更新 PATH?

为什么符号链接是 opt 中可执行文件的首选解决方案,而不是更新 PATH?

在这回答提供了将所有 /opt/tool/bin 子目录添加到 PATH 的方法:

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

但随后吉尔斯说道:

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

最后一个其他答案支持了这一论断。

但我不明白为什么符号链接到可执行文件/opt/*/bin更可取。看来这增加了不必要的额外维护。

为什么符号链接是 opt 中可执行文件的首选解决方案,而不是更新 PATH?

答案1

试图回答这个问题,但不说哪个解决方案是“最好的”,而只是为了解释为什么吉尔斯可能建议使用符号链接来提供一组工具,并解决其维护方面的问题。最后,由本地管理员决定其系统上合适的解决方案是什么。

通过将bin目录添加到 users' PATH,添加新工具将需要更新所有用户的PATH变量(在启动新的 shell 会话之前该变量不会生效)。

使用 GNU stow,正如 Gilles 建议的那样,您将在例如下有一个目录结构,/opt/stow每个工具都有一个目录,每个工具都有自己的binlib子目录。每个工具通常都是通过指定/opt/stow/toolname安装前缀来安装的。

子目录将通过 符号链接到相应目录/optstow因此维护成本最小。您必须添加的唯一目录可能PATH是./opt/bin/opt/sbin

通常,您会有

/opt/stow/tool-A-1.23
/opt/stow/tool-A-1.25
/opt/stow/tool-B-3.0

然后:

cd /opt/stow
stow tool-A-1.23
stow tool-B-3.0

这将/opt使用适当的符号链接填充层次结构,从而允许您访问/opt/bin.这是假设工具之间的可执行文件不存在名称冲突,但话又说回来,在将所有这些路径添加到PATH.

要从 1.23 切换到 1.25 tool-A

cd /opt/stow
stow -D tool-A-1.23
stow tool-A-1.25

永远不需要手动维护符号链接或更改用户的PATH,并且更改对于所有用户来说都是立即的。

答案2

全部放入/opt/*/binPATH缺点是,每次安装某个新应用程序或更新另一个应用程序(路径中发生相应的更改)时,都需要更改列表。

用户将需要重新登录,或手动更新其路径。对于简单的登录-做-东西-注销用例,这可能不是问题,但对于长时间运行的会话,就像任何运行screen或 的人一样tmux,这就是问题。 (您可能有使用旧版本运行的 shell(或 Emacs)PATH,并且终端多路复用器本身也将使用旧版本PATH,如果它直接运行实用程序,这一点很重要。)

此外,这样做的结果将是一个视觉上相当令人不快的目录列表,您可能不希望用户看到它。如果他们PATH不需要关心安装在/opt.

另外,如果您需要PATH在 中显式设置 ,则只需编写此类内容crontab会更容易/bin:/usr/bin/:/opt/bin,而不必在 中编写和更新实际目录列表/opt。您不能在 中使用循环和 glob crontab

至于行政管理费用,拘萨罗南达讨论stowln -s ../someutil-1.2.3/bin/* .,但即使没有它,创建必要的符号链接也可以通过在 内运行来完成/opt/bin。 (删除旧的不是微不足道,但是当您删除实用程序的目录时留下损坏的链接不会影响 shell 的行为,它只是有点不干净。)

答案3

需要解决的主要问题是程序名称冲突。

拥有一个大的PATH值不再是问题,因为自 1977 年以来,Bourne Shell 中就存在二进制路径位置的哈希值。

有符号链接是不常见的,除了一个原因:

能够拥有与集群视图不同的自己的程序选择。

例如,如果您将 PATH 设置为:

PATH=/usr/gnu/bin:/usr/bin

您会在标准系统工具之前找到所有 GNU 工具。

这可能使您可以轻松地使用 GNU 工具,但这也导致被迫使用例如chmod不支持 ACL 的 GNU 以及使用tar因创建具有可移植性问题的存档而闻名的 GNU。

让我们假设您基本上对 GNU 感兴趣,xgettext但喜欢使用官方系统工具,其中包括对 GNU 工具不知道的扩展系统功能的支持。这可以通过创建自己的 bin 目录来完成,例如调用:

mkdir ~/bin

如果您随后创建符号链接:

cd ~/bin
ln -s /usr/gnu/bin/xgettext

并设置此路径:

PATH=~/bin:/usr/bin:/usr/gnu/bin

如果你调用,你会得到GNU xgettext ,但如果你调用eg或 ,你会得到xgettext官方系统工具。由于通常有指向 GNU 工具的符号链接,但它们的本机前缀为(例如to ),因此您仍然可以通过调用 来有意使用 GNU tar 。chmodtar/usr/bin//usr/bin/gtar/usr/gnu/bin/targtar

BTW:/opt/bin不是 UNIX FHS 标准的一部分,该标准列出了

/opt/<vendor>/bin

并不是

/opt/<project>/bin

尽管有后者的例子。

相关内容