我已经多次查找手册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) $