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


16

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

update-alternatives手册中:

--install <link> <name> <path> <priority>

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

sudo update-alternatives --install /tmp/randomStuff java /usr/local/java/jre1.7.0_25/bin/java 0

该命令将输出:

update-alternatives: renaming java link from /usr/local/bin/java to /tmp/randomStuff.

阅读输出,我发现了指向替代项的旧链接,因此我终于可以使用正确的<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

效果很好,但是如您所见,以/tmp/randomStuffas为<link>参数运行命令非常尴尬。

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

Answers:


13

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

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

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

usr@srv % update-alternatives --query java
Name: java
Link: /usr/bin/java
[...]

因此,您会看到我的链条像/usr/bin/java -> /etc/alternatives/java -> ...

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

update-alternatives --query java | /bin/grep Link | cut -f 2 -d " "

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

编辑

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

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

usr@srv $ sed -ne 2p /var/lib/dpkg/alternatives/java
/usr/bin/java

但是,对于拥有较旧版本的用户来说,这只是一个解决方法update-alternatives


感谢您的回答,但是我正在运行的更新替代版本(1.16.1.2)既不使用--query也不使用--display来显示链接信息。您使用的是哪个版本? sudo update-alternatives --query java Link: java Status: auto Best: /usr/local/java/jre1.6.0_45/bin/java Value: /usr/local/java/jre1.6.0_45/bin/java Alternative: /usr/local/java/jre1.6.0_45/bin/java Priority: 0
pagliuca

我已经1.16.10安装好了。您不能更新您的版本吗?
2013年

你是男人!两种解决方案都非常好!
pagliuca

6

这里的Simpleton问题:难道不是<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*

然后我可以使用:

sudo update-alternatives --install /usr/bin/pycharm pycharm /opt/pycharm-community-4.5.0/bin/pycharm.sh 0

对于我的新pycharm安装。

然后,也许您可​​以构造一个脚本以使用的输出which


感谢您的提示,但有时这将无济于事。我update-alternatives还经常跟踪firefox的Java和Flash插件,但我总是忘记应该将这些插件放在其中的路径“ / usr / lib / mozilla / plugins”。我无法使用whichwhereis或任何想到的命令找到该路径,而@binfalse的答案在我运行时正确地在我的机器上返回了该路径update-alternatives --query java-plugin
pagliuca
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.