`update-alternatives` 到底起什么作用?

`update-alternatives` 到底起什么作用?

该命令有何update-alternatives用途?

请看这个例子:

sudo update-alternatives --install /usr/bin/java java /usr/local/java/jre1.7.0_09/bin/java 1

它起什么作用? 它和将 jdk 添加到路径有何不同?

假设我已运行该命令。我该如何恢复到原始状态?

答案1

它会更新 中的链接/etc/alternatives以指向用于此目的的程序。有很多示例,如x-www-browsereditor等,它们将链接到您喜欢的浏览器或编辑器。某些脚本或系统工具可能希望您手动编辑文件(例如 中的配置冲突dpkg),它们会研究替代方案以向您提供首选编辑器。对于java,这是 Java 运行时环境 - Oracle、OpenJRE 等。

中的链接/etc/alternatives只是符号链接。例如,您可以使用

ls -l /etc/alternatives

此外,常规/usr/bin二进制文件也是符号链接。例如:

ls -l /usr/bin/java
  lrwxrwxrwx 1 root root 22 Aug 14 10:33 /usr/bin/java -> /etc/alternatives/java
ls -l /etc/alternatives/java
  lrwxrwxrwx 1 root root 46 Aug 14 10:33 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java

因此,无需PATH修改。它只是使用符号链接。

答案2

虽然@gertvdjik 的回答很好地解释了替代方案在较低层次上如何发挥作用,但它并没有明确说明如何恢复原始状态。

我发现使用galternatives作为软件包提供的相应 GUI 更方便。要安装它,只需运行:

sudo apt-get install galternatives

然后管理替代方案就变得容易多了。特别是对于 Java,你有很多辅助二进制文件需要更新,在 GUI 中概览它们会更快。

答案3

更新替代方案创建、删除、维护并显示有关组成 Debian 替代系统的符号链接的信息。

...

通用名称不是所选替代方案的直接符号链接。相反,它是指向 备选目录,它又是指向实际引用文件的符号链接。这样做是为了使系统管理员的更改能够限制在/ETC目录 ...

来源及更多详细信息:man update-alternatives

除此之外:主/从术语可能会在某个时候更新。

以 Ubuntu 22.04 为例,我可以切换哪个我正在使用的 Java sudo update-alternatives --config java

$ sudo update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      manual mode
* 2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode

Press <enter> to keep the current choice[*], or type selection number: 

因此,回答最初的问题:

  • 更新替代方案更新符号链接
  • 从上下文来看,你的意思是小路,但它不会改变 PATH 或JDK,例如从 Java 11 升级到 Java 8直接地
  • 它没有什么像历史内置,所以一般情况下无法恢复到原始状态。我希望您需要选择最适合您系统状态的替代方案(实际上,当您第一次遇到这种情况时,您很可能只有两种替代方案,因此如果您最近安装了第二种替代方案,但该替代方案对您造成了破坏,则只有另一种替代方案可以切换回)

答案4

并且update-alternatives可以创建一个组以轻松切换。例如javaw,如果切换,javajavac需要一起使用java。然后javawjavac应该安装为的从属java。或者ockubectl(openshift客户端和kubernetes控制)也应该一起使用。我已经安装了oc v3和v4,每个版本都有自己的kubectl。所以我这样做:

sudo update-alternatives --install /usr/bin/oc oc /opt/oc3/oc 2 --slave /usr/bin/kubectl kubectl /opt/oc3/kubectl
sudo update-alternatives --install /usr/bin/oc oc /opt/oc4/oc 1 --slave /usr/bin/kubectl kubectl /opt/oc4/kubectl

因此 oc3 及其 kubectl 被优先考虑。

相关内容