使用更新替代品添加替代品的更好方法?

pag*_*uca 22 command-line alternatives

update-alternatives查了好几次手册,但我找不到如何显示指向特定替代方案的当前链接,并且在添加新替代方案时需要该信息。

update-alternatives手册:

--install <link> <name> <path> <priority>
Run Code Online (Sandbox Code Playgroud)

假设我想添加新版本的 Java Runtime Edition,但我不知道链接到替代项(<link>参数)的当前符号链接。我目前做的是:

sudo update-alternatives --install /tmp/randomStuff java /usr/local/java/jre1.7.0_25/bin/java 0
Run Code Online (Sandbox Code Playgroud)

该命令将输出:

update-alternatives: renaming java link from /usr/local/bin/java to /tmp/randomStuff.
Run Code Online (Sandbox Code Playgroud)

阅读输出我找到了指向替代的旧链接,所以我终于可以使用正确的<link>参数再次运行我的命令,更改/tmp/randomStuff/usr/local/bin/java

sudo update-alternatives --install /usr/local/bin/java java /usr/local/java/jre1.7.0_25/bin/java 0
Run Code Online (Sandbox Code Playgroud)

这工作正常,但如您所见,使用/tmp/randomStuffas<link>参数运行命令非常尴尬。

因此,问题来了:(1)是否有任何update-alternative参数可以输出指向特定替代方案的当前链接,或者(2)是否有一种方法可以安装新替代方案而无需提供新参数,只需保持当前<link>

bin*_*lse 15

要回答您的第一个问题,我想提示您--query

   --query name
          Display information about the link group like --display does, but in a machine parseable way (see section QUERY FORMAT below).
Run Code Online (Sandbox Code Playgroud)

有了这个,您将获得链接源,例如在我的 Java 案例中:

usr@srv % update-alternatives --query java
Name: java
Link: /usr/bin/java
[...]
Run Code Online (Sandbox Code Playgroud)

所以,你看我的链子就像/usr/bin/java -> /etc/alternatives/java -> ...

不幸的是,我无法回答你的第二个问题。前段时间我一直在寻找解决方案,但似乎还没有简单的解决方法。您可以做的是编写一些 hack 来解析--query调用的输出,可能是这样的:

update-alternatives --query java | /bin/grep Link | cut -f 2 -d " "
Run Code Online (Sandbox Code Playgroud)

然后您可以将其用作--install呼叫的输入。但是因为在我看来这很混乱,所以我不会推荐它。相反,您可能想看看galternatives,替代系统的前端。即使我不喜欢在这些基本工作中使用图形化的东西,它也很方便,我最终使用了这个工具而不是命令行工具。

编辑

我很好奇如何update-alternatives知道命令符号链接是什么,并简要查看了来源。当然,替代系统必须存储每个组的配置,事实证明它被称为管理目录并写在手册页上 ;-)

您可以在/var/lib/dpkg/alternatives(默认情况下)中找到此信息。每个文件中的第二行定义了您要查找的主链接。您可以像这样提取它:

usr@srv $ sed -ne 2p /var/lib/dpkg/alternatives/java
/usr/bin/java
Run Code Online (Sandbox Code Playgroud)

但是,对于那些使用旧版本update-alternatives.


小智 6

简单的问题在这里: 不是<link>总是会被一个简单的检索到,which [program]因为这是系统用来通过命令行调用程序的链接吗?

例如,追溯pycharm的链接我得到:

user@computer:~$ which pycharm
/usr/bin/pycharm
user@computer:~$ ll /usr/bin/pycharm
lrwxrwxrwx 1 root root 25 Mar 12  2015 /usr/bin/pycharm -> /etc/alternatives/pycharm*
user@computer:~$ ll /etc/alternatives/pycharm 
lrwxrwxrwx 1 root root 43 Mar 12  2015 /etc/alternatives/pycharm -> /opt/pycharm-community-4.0.5/bin/pycharm.sh*
Run Code Online (Sandbox Code Playgroud)

然后我可以使用:

sudo update-alternatives --install /usr/bin/pycharm pycharm /opt/pycharm-community-4.5.0/bin/pycharm.sh 0
Run Code Online (Sandbox Code Playgroud)

对于我的新 pycharm 安装。

那么也许您可以构建一个脚本来使用which.