如何安装一个可执行程序

一般来说我们一个可执行程序,可能在多个路径下,比如在opt路径下,或者在自己的home下。

当要达到在系统的任意路径下敲击该命令,都可执行的话,一般要将该可执行命令的路径加入到环境变量PATH中。

加入PATH可以是直接到/etc/profile.d/中定义一个sh文件,在其中将该可执行程序的路径加入其中,比如

JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
export JAVA_HOME

当然还可以将可执行文件,以软连接的形式,放入到一般系统会找寻的目录中。比如一般linux系统的PATH,默认都有这几个路径

  • /bin 系统启动加载阶段需要使用的命令,比如cat,ls
  • /sbin 系统启动加载阶段需要使用,并且需要root权限才能执行的命令
  • /usr/bin 整个系统范围内都能使用的命令
  • /usr/sbin 整个系统范围内都能使用的命令,但需要管理员权限

比如我们装一个java,如果想在任意路径敲击java后,都启动java(不考虑JAVA_HOME这个环境变量),我们可以在/usr/bin下创建一个软连接文件java , 将其链接到我们java的具体路径,比如

/usr/bin/java -> /usr/java/jdk1.8.0_221-amd64/jre/bin/java

这样做的好处是,其它程序需要使用java时,它直接去/usr/bin中找就好,无论java实际路径怎么存放,使用java的程序,不需要修改。

当一个可执行程序有多个版本怎么办 , alternatives

上述只介绍了一个可执行程序的全局安装方式。但如果一个程序,有好几个版本的实现。系统怎么判断该使用哪一个版本?

比如我们即安装了java8,又安装了java10。 这就是alternatives机制要解决的。

alternatives机制,能够自动选择高版本程序作为默认程序,或者使用管理员指定的版本作为默认的程序。

一个alternatives机制,涉及如下术语

  • Generic name 不考虑版本,这个程序对应的名字,比如不考虑java的版本,我们一般同一使用java作为启动命令,其generic name 为:/usr/bin/java
  • Alternatives directory Alternatives 机制,默认使用软连接的方式,去链接实际的程序版本。该路径下展示了所有的软连接
  • Link group 而一般一个可执行程序,除了自己之外,还需要依赖一些其他的库文件,或与之对应的配置文件。这些需要一并连接。所以跟这个程序相关的一组连接叫做link group
  • Master link 连接组中程序主体的链接
  • Slave link 链接中程序依赖相关的文件链接

alternatives管理的命令为update-alternatives

版本选择的两种模式

当安装的alternatives有多个版本时。操作系统默认选择哪个版本,有两种模式

  • 自动模式,基于权重自动判断,高权重为自动启用版本。并且新安装的版本由于权重高,自动成为默认版本
  • 手动模式,系统管理员通过命令sudo update-alternatives --config command手动指定一个版本为默认版本,即便后来又装了更新的版本,默认版本都不会变。

管理手动指定版本后,该alternative即进入手动模式。如果要回滚到自动模式,使用命令

手动安装一个alternatives

安装一个alternatives

  1. 表示在/usr/local/bin/下创建的genericname。当然,用户侧程序,一般创建在/usr/bin下,而不是截图中的/usr/local/bin中。generic name一般没有版本
  2. 整个Link group的名称,一般跟generic name一致
  3. 链接的执行程序实际版本的路径
  4. 当前安装版本对应的权重。alternatives 如果是自动模式的话,会基选权重高的版本做为默认程序

上述程序的两个版本的实际路径是

  • /usr/local/bin/foo-2
  • /usr/local/bin/foo-3

带slave links的安装

跟上述安装类似,只是附加指定了主程序依赖的相关配置作为slave link

总结

默认情况下,上述步骤不需要我们手动来做。一般在安装一个linux的安装包时,会自动完成上述步骤。并且安装好的alternatives都是auto模式,即自动决定程序版本

alternatives的一些命令

如何查看一个程序的alterntives 整体情况

sudo update-alternatives --display commandname

手动指定一个版本

列出多个版本,以交互的方式让用户选择指定版本

sudo update-alternatives --config commandname

直接将默认程序设置到某个具体版本的路径上

sudo update-alternatives --set commandname path

如何回退到自动模式

sudo update-alternatives  --auto commandname

从alternatives中移除指定版本

sudo update-alternatives  --remove commandnamepath

举例

sudo update-alternatives --remove foo /usr/local/bin/foo-2

移除指定程序的所有alternatives

sudo update-alternatives  --remove-all commandname

参考链接

https://linux.die.net/man/8/alternatives

https://documentation.suse.com/sles/15-SP1/html/SLES-all/cha-update-alternative.html

/etc/alternatives的更多相关文章

  1. scala - multiple overloaded alternatives of method bar define default arguments

    同名同位置默认参数不能overload def bar(i:Int,s:String="a"){} def bar(i:String,s:String="b") ...

  2. alternatives命令用法

    alternatives是Linux下的一个功能强大的命令.只能在根权限下执行.如系统中有几个命令功能十分类似,却又不能随意删除,那么可以用替代指定一个全局的设置.alternatives常用于同一个 ...

  3. Linux 命令 alternatives和update-alternatives

    参考: http://lionbule.iteye.com/blog/717722 http://manpages.ubuntu.com/manpages/oneiric/man8/update-al ...

  4. alternatives命令使用方法

    alternatives命令使用方法 alternatives是Linux下的一个功能强大的命令.仅仅能在root权限下运行.如系统中有几个命令功能十分相似,却又不能任意删除,那么能够用 altern ...

  5. 使用Linux的alternatives命令替换选择软件的版本

    上周在安装搜索引擎Elasticsearch时,要求安装比较新的java 版本,我选择了java 1.8.0,安装java 成功后使用java -version 发现使用的版本仍旧是1.6.0, 查询 ...

  6. centos/linux alternatives与update-alternatives详解与软件版本切换

    update-alternatives是linux系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令.哪个软件版本,比如,我们在系统中同时安装了open jdk和sun j ...

  7. 关于Linux系统下jdk版本切换问题(alternatives命令的使用)

    [root@danny lib]# cd /usr/lib/jvm [root@danny jvm]# [root@danny jvm]# ls java java--openjdk-.b13.el7 ...

  8. MobaXterm的一些介绍(Top 5 SSH Clients for Windows (Alternatives of PuTTY))

    Top 5 SSH Clients for Windows (Alternatives of PuTTY) http://tecadmin.net/top-5-ssh-clients-for-wind ...

  9. linux alternatives命令详解

    alternatives是Linux下的一个功能强大的命令.只能在root权限下执行.如系统中有几个命令功能十分类似,却又不能随意删除,那么可以用 alternatives 来指定一个全局的设置. a ...

  10. Top 5 SSH Clients for Windows (Alternatives of PuTTY)

    这篇博文列举了可以替代putty的5个工具,有些实现了putty没有实现的一些功能.如下: PuTTy is the most popular SSH clients for Windows-base ...

随机推荐

  1. select 标签的数据绑定

    修改数据的页面 进入页面绑定select的值 会value绑定但是没有显示相应的option <script> $("#id option[value=${item.decora ...

  2. 如何发布自己用python写的py模块

    Python——怎么发布你的Python模块 我们在学习Python的时候,除了用pip安装一些模块之外,有时候会从网站下载安装包下来安装,我也想要把我自己编写的模块做成这样的安装包,该怎么办,如何发 ...

  3. flask之session

    ''' session使用: session创建: (1)导入session from flask import session (2)设置secret_key密钥 app.secret_key='s ...

  4. 王艳 201771010127《面向对象程序设计(java)》第十六周学习总结

    一:理论部分 1.程序:是一段静态的代码,它是应用程序执行的蓝本. 2.进程:是程序的一次动态执行,它对应了从代码加载.执行至执行完毕的一个完整过程. 3.多线程:是进程执行过程中产生的多条执行线索. ...

  5. Intel FPGA Clock Region概念以及用法

    目录 Intel FPGA 的Clock Region概念 Intel 不同系列FPGA 的Clock Region 1. Clock Region Assignments in Intel Stra ...

  6. SQL——SQL约束

    SQL约束 - 用于限制加入表的数据的类型    可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句).    NOT NULL ...

  7. Ant Design of Vue 组件库的使用

    文档里面很清楚 安装步骤    这是全部引入的 1  有的组价涉及到汉化的问题 import moment from 'moment' import '../../../../node_modules ...

  8. 使用for循环疑难问题

    接触js的基本语句之后,有一些疑难杂症在初期很难自己想出来,对我自己来说for输出三角形,倒三角行还有等腰三角形还是有点难度,所以记录一下,以便以后查找 倒三角,需要控制每行的输出个数,此处可以想象为 ...

  9. ArrayList简介

    ArrayList简介 ArrayList以数组为底层数据结构的集合,是一个动态的数组队列,就是说该类的容量可以增长,与一般的数组不同. public class ArrayList<E> ...

  10. oracle表按日期分区创建、新增、修改、删除

    Oracle11G分区表 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多 ...