使用 update-alternatives 添加替代方案的更好方法?

使用 update-alternatives 添加替代方案的更好方法?

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

update-alternatives手册:

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

假设我想添加新版本的 Java Runtime Edition,但我不知道链接到替代项(<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/randomStuff这很好用,但是正如您所看到的,使用参数运行命令<link>非常尴尬。

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

答案1

为了回答你的第一个问题,我想提示你--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 -> ...

不幸的是,我无法回答你的第二个问题。我前一段时间一直在寻找解决方案,但似乎还没有简单的解决方法。你可以做的是编写一些 hack 来解析--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.

答案2

Simpleton 问题在这里: 难道不是总是<link>由 simple 检索到相同的链接,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.

答案3

使用 --install 时,不需要重新提供所有现有的替代方案。请参阅以下位置的示例https://wiki.debian.org/DebianAlternatives。在这里,我添加 /usr/local/bin/alacrtty 作为 x-terminal-emulator 的替代品,并选择它:

[schwarzgerat](0) $ sudo update-alternatives --install /usr/bin/x-terminal-emualtor x-terminal-emulator /usr/local/bin/alacritty 10
update-alternatives: renaming x-terminal-emulator link from /usr/bin/x-terminal-emulator to /usr/bin/x-terminal-emualtor
[schwarzgerat](0) $ sudo update-alternatives --config x-terminal-emulator
There are 16 choices for the alternative x-terminal-emulator (providing /usr/bin/x-terminal-emualtor).

  Selection    Path                             Priority   Status
------------------------------------------------------------
  0            /usr/bin/terminator               50        auto mode
  1            /usr/bin/gnome-terminal.wrapper   40        manual mode
* 2            /usr/bin/kitty                    20        manual mode
  3            /usr/bin/koi8rxterm               20        manual mode
  4            /usr/bin/konsole                  40        manual mode
  5            /usr/bin/lxterm                   30        manual mode
  6            /usr/bin/mlterm                   20        manual mode
  7            /usr/bin/pangoterm                15        manual mode
  8            /usr/bin/st                       15        manual mode
  9            /usr/bin/terminator               50        manual mode
  10           /usr/bin/terminology              40        manual mode
  11           /usr/bin/terminus                 20        manual mode
  12           /usr/bin/urxvt                    20        manual mode
  13           /usr/bin/uxterm                   20        manual mode
  14           /usr/bin/xfce4-terminal.wrapper   40        manual mode
  15           /usr/bin/xterm                    20        manual mode
  16           /usr/local/bin/alacritty          10        manual mode

Press <enter> to keep the current choice[*], or type selection number: 16
update-alternatives: using /usr/local/bin/alacritty to provide /usr/bin/x-terminal-emualtor (x-terminal-emulator) in manual mode
[schwarzgerat](0) $

相关内容