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.