如何安装一个可执行程序

一般来说我们一个可执行程序,可能在多个路径下,比如在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. PAT 1011 World Cup Betting (20分) 比较大小难度级别

    题目 With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly exc ...

  2. chrome "items hidden by filters"

    今天更新chrome 后遇到console不能显示errors的问题,折腾一番后发现在console的Default levels中选择Default即可.

  3. scrapy请求发送详解

    scrapy自动发送请求 对start_urls列表中存储的起始url进行过请求的发送并没有通过手动实现,但是在parse函数中还是获取到了响应数据,这是因为爬虫文件中的爬虫类继承到了Spider父类 ...

  4. js 文本框只能输入数字和点

    http://www.jb51.net/article/51102.htm 手机端 只能输入数字,能输小数点.且只能2位小数 oninput="this.value=this.value.r ...

  5. poj3694 连通无向图图加边后有多少桥

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 10261   Accepted: 3807 Descript ...

  6. 【python 爬虫】fake-useragent Maximum amount of retries reached解决方案

    前言 在用fake-useragent的时候发生报错,fake_useragent.errors.FakeUserAgentError: Maximum amount of retries reach ...

  7. 快服务常见TOP3审核雷区,再不过审就要崩溃啦!

    仰天大笑出门去,审核提交很神气. 垂死病中惊坐起,突然驳回伤不起. 江州司马青衫湿,重新修改苦自知. 梦里花落知多少,回复马上就改好. 审批被驳回可能是最常见的令开发者头大的问题了,明明看起来&quo ...

  8. 「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !

    本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指南」一份涵盖大 ...

  9. 【C++】VS Code配置

    0.前言 本文已配置C++环境为例,本文主要是面向刚开始接触VS Code的朋友,采用生成默认配置任务的方法,在编写本文过程中大量参考了官方文档,感兴趣的朋友可直接前往传送门. 环境: win10 + ...

  10. static关键字的应用

    static关键字的应用:使用静态的变量可以实现   "累加" 的效果 package com.aff.statics; public class TestCircle { pub ...