翼度科技»论坛 云主机 LINUX 查看内容

Linux下alternatives命令学习总结

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
在Linux系统中提供了一个alternatives命令,用于在多个同功能的软件,或软件的多个不同版本间选择、切换。简单来说就是版本切换控制。例如,你的操作系统有多个Python版本,例如python3.6,Python 3.9,如果不用alternatives命令,那么你可能需要通过手工修改软链接来实现Python版本的切换。如果用alternatives命令就可以很容易的实现Python版本的切换和管理。
另外,关于命令alternatives与update-alternatives的关系,其实先有update-alternatives命令,然后才有alternatives,update-alternatives最开始是Debian Linux下的一个项目,用于管理多版本,它是Perl编写的,然后RHEL重写了这个项目,名字也改为了alternatives,alternatives则在基于Fedora的分发版本(Redhat, CentOS)中发行,传播,而update-alternatives一般存在Debian Linux下。但是为了统一或者方便,在RHEL下你也会看到update-alternatives这个命令,它此时实际上是一个软链接,指向alternatives命令。如下所示:
  1. # more /etc/redhat-release 
  2. Red Hat Enterprise Linux release 8.8 (Ootpa)
  3. # whereis alternatives
  4. alternatives: /usr/sbin/alternatives /etc/alternatives /usr/share/man/man8/alternatives.8.gz
  5. # whereis update-alternatives
  6. update-alternatives: /usr/sbin/update-alternatives /usr/share/man/man8/update-alternatives.8.gz
  7. # ll /usr/sbin/update-alternatives
  8. lrwxrwxrwx. 1 root root 12 Jul 27  2021 /usr/sbin/update-alternatives -> alternatives
复制代码
查看alternatives命令的帮助信息

alternatives或alternatives --help
  1. $ alternatives
  2. alternatives version 1.19.1 - Copyright (C) 2001 Red Hat, Inc.
  3. This may be freely redistributed under the terms of the GNU Public License.

  4. usage: alternatives --install <link> <name> <path> <priority>
  5.                     [--initscript <service>]
  6.                     [--family <family>]
  7.                     [--slave <slave_link> <slave_name> <slave_path>]*
  8.        alternatives --remove <name> <path>
  9.        alternatives --auto <name>
  10.        alternatives --config <name>
  11.        alternatives --display <name>
  12.        alternatives --set <name> <path>
  13.        alternatives --list
  14.        alternatives --remove-all <name>
  15.        alternatives --add-slave <name> <path> <slave_link> <slave_name> <slave_path>
  16.        alternatives --remove-slave <name> <path> <slave_name>

  17. common options: --verbose --test --help --usage --version --keep-missing --keep-foreign
  18.                 --altdir <directory> --admindir <directory>
复制代码
主要常使用的参数是 install ,remove,config,display,list这5个参数。
  1. install  --生成软连接

  2. remove   --删除软连接

  3. config   --选择软连接

  4. display  --显示软连接

  5. list     --显示所有软连接
复制代码
例子:显示所有软连接
  1. $ alternatives --list
  2. libnssckbi.so.x86_64    auto    /usr/lib64/pkcs11/p11-kit-trust.so
  3. python                  auto    /usr/libexec/no-python
  4. cifs-idmap-plugin       auto    /usr/lib64/cifs-utils/cifs_idmap_sss.so
  5. ld                      auto    /usr/bin/ld.bfd
  6. modules.sh              auto    /usr/share/Modules/init/profile.sh
  7. python3                 manual  /usr/bin/python3.9
复制代码
例子:显示python3的软连接
  1. $ alternatives --display python3
  2. python3 - status is manual.
  3.  link currently points to /usr/bin/python3.9
  4. /usr/bin/python3.6 - priority 1000000
  5.  slave easy_install-3: /usr/bin/easy_install-3.6
  6.  slave pip-3: /usr/bin/pip-3.6
  7.  slave pip3: /usr/bin/pip3.6
  8.  slave pydoc-3: /usr/bin/pydoc3.6
  9.  slave pydoc3: /usr/bin/pydoc3.6
  10.  slave pyvenv-3: /usr/bin/pyvenv-3.6
  11.  slave python3-man: /usr/share/man/man1/python3.6.1.gz
  12. /usr/bin/python3.9 - priority 3900
  13.  slave easy_install-3: /usr/bin/easy_install-3.9
  14.  slave pip-3: /usr/bin/pip-3.9
  15.  slave pip3: /usr/bin/pip3.9
  16.  slave pydoc-3: /usr/bin/pydoc3.9
  17.  slave pydoc3: /usr/bin/pydoc3.9
  18.  slave pyvenv-3: (null)
  19.  slave python3-man: /usr/share/man/man1/python3.9.1.gz
  20. Current `best' version is /usr/bin/python3.6.
复制代码
如上所示,--display显示链接组的所有信息,包括链接的模式(自动还是手动)、链接priority值、所有可用的链接命令
例子:选择软连接

注意,选择软链接必须使用root权限,否则会遇到权限问题,如下所示:
  1. $ alternatives --config python3

  2. There are 2 programs which provide 'python3'.

  3.   Selection    Command
  4. -----------------------------------------------
  5. *  1           /usr/bin/python3.6
  6.  + 2           /usr/bin/python3.9

  7. Enter to keep the current selection[+], or type selection number: 1
  8. failed to create /var/lib/alternatives/python3.new: Permission denied
复制代码
root用户下操作:
  1. # alternatives --config python3

  2. There are 2 programs which provide 'python3'.

  3.   Selection    Command
  4. -----------------------------------------------
  5. *  1           /usr/bin/python3.6
  6.  + 2           /usr/bin/python3.9

  7. Enter to keep the current selection[+], or type selection number: 1
  8. # alternatives --list
  9. libnssckbi.so.x86_64    auto    /usr/lib64/pkcs11/p11-kit-trust.so
  10. python                  auto    /usr/libexec/no-python
  11. cifs-idmap-plugin       auto    /usr/lib64/cifs-utils/cifs_idmap_sss.so
  12. ld                      auto    /usr/bin/ld.bfd
  13. modules.sh              auto    /usr/share/Modules/init/profile.sh
  14. python3                 manual  /usr/bin/python3.6
复制代码
(*)星号表示当前系统使用的版本,加号表示优先级最高的。输入数值可修改默认配置,直接按回车保持原来状态
例子:生成软连接python
  1. alternatives --install <link> <name> <path> <priority>

  2. # link是在/usr/bin/,/usr/local/bin/等默认PATH搜索目录
  3. # name是在/etc/alternatives目录中的链接名
  4. # path是真正的可执行程序的位置,可以在任何位置
  5. # priority是优先级
复制代码
例如,当前环境只有python3,你想使用python这个命令,而不想使用python3的话,那么我们可以生成一个软连接。
  1. # alternatives --install /usr/bin/unversioned-python python /usr/bin/python3.9 2
  2. # alternatives --list | grep python
  3. python                  auto    /usr/bin/python3
  4. python3                 manual  /usr/bin/python3.9
复制代码
注意,link的命令最好合乎规范,否则可能有告警信息:
  1. # alternatives --install /usr/bin/python python /usr/bin/python3.9 2
  2. the primary link for python must be /usr/bin/unversioned-python
  3. # alternatives --list
  4. libnssckbi.so.x86_64    auto    /usr/lib64/pkcs11/p11-kit-trust.so
  5. python                  auto    /usr/bin/python3
  6. cifs-idmap-plugin       auto    /usr/lib64/cifs-utils/cifs_idmap_sss.so
  7. ld                      auto    /usr/bin/ld.bfd
  8. modules.sh              auto    /usr/share/Modules/init/profile.sh
  9. python3                 manual  /usr/bin/python3.9
复制代码
关于priority优先级, 当命令链接已存在时,需高于当前值,因为当alternative为自动模式时,系统默认启用priority高的链接
例子:删除软连接
  1. # alternatives --remove python /usr/libexec/no-python
复制代码
那么我们接下来简单探究一下,在版本切换时,alternatvies命令做了一下啥
  1. # alternatives --list | grep python3
  2. python                  auto    /usr/bin/python3
  3. python3                 manual  /usr/bin/python3.9
  4. # whereis python3
  5. python3: /usr/bin/python3.6 /usr/bin/python3.6m /usr/bin/python3 /usr/bin/python3.9 /usr/lib/python3.6 /usr/lib/python3.9 /usr/lib64/python3.6 /usr/lib64/python3.9 /usr/include/python3.6m /usr/include/python3.9 /usr/share/man/man1/python3.1.gz
  6. # ll /usr/bin/python3
  7. lrwxrwxrwx. 1 root root 25 May 12 11:04 /usr/bin/python3 -> /etc/alternatives/python3
  8. # ll /etc/alternatives/python3
  9. lrwxrwxrwx 1 root root 18 Jul  6 15:00 /etc/alternatives/python3 -> /usr/bin/python3.9
  10. # ll /usr/bin/python3.9
  11. -rwxr-xr-x 1 root root 7776 Dec 21  2022 /usr/bin/python3.9
  12. # alternatives --config python3

  13. There are 2 programs which provide 'python3'.

  14.   Selection    Command
  15. -----------------------------------------------
  16. *  1           /usr/bin/python3.6
  17.  + 2           /usr/bin/python3.9

  18. Enter to keep the current selection[+], or type selection number: 1
  19. # python3 --version
  20. Python 3.6.8
  21. # ll /usr/bin/python3
  22. lrwxrwxrwx. 1 root root 25 May 12 11:04 /usr/bin/python3 -> /etc/alternatives/python3
  23. # ll /etc/alternatives/python3
  24. lrwxrwxrwx 1 root root 18 Jul  7 10:46 /etc/alternatives/python3 -> /usr/bin/python3.6
复制代码
如上所示,我们看到alternatvies其实是通过多一层软链接,例如,/usr/bin/python3指向/etc/alternatives/python3,这一层关系不变,切换python版本时,我们看到链接/etc/alternatives/python3 指向了不同的python版本来实现的。
扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
来源:https://www.cnblogs.com/kerrycode/p/17534576.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具