Linux不同发行版安装安装命令与软件包不一致的命令

当编写脚本时,可能会遇到需要的命令在系统中没有安装, 此时需要解决命令依赖的问题,解决方法为安装对应的软件。Linux下大量的发行版,且不同发行版一般使用不同的包管理器,这导致了安装软件需要执行不同的安装命令,于是需要解决第二个问题:使用通用Linux命令探测系统安装的包管理器,然后确定安装命令。但是有时候,软件包提供的命令与其包的名称并不一致,这里就需要建立一个命令与包的映射关系,以正确执行安装命令。按照这个思路,本文提供一个基础的脚本:

通用安装脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#! /bin/sh
#
# readycmd.sh
# Author : fengzhenhua
# Email : fengzhenhua@outlook.com
# Date : 2024-06-14 15:58
# CopyRight: Copyright (C) 2022-2030 FengZhenhua(冯振华)
# License : Distributed under terms of the MIT license.
# Objective: 在不同的发行版中安装命令与软件包名不同的命令
#
# 包管理器列表: 管理器=安装命令
declare -A RD_PKG=(\
["pacman"]="pacman -S --needed --confirm" #arch endeavour manjaro 等
["apt-get"]="apt-get -y install" #debian ubuntu 等
["yum"]="yum -y install" #redhat centos7 及以下
["dnf"]="dnf -y install" #fedora centos8
["zypper"]="zypper -y install" #open suse
)
# 待安装软件列表: 命令=软件名
declare -A RD_CMD=(\
["unar"]="unarchiver" ["ssh"]="openssh" ["nvim"]="neovim"
)
# 选择发行版中的包管理器
for sh_pkg in ${!RD_PKG[*]}; do
which $sh_pkg &> /dev/null
if [ $? = 0 ]; then
RD_PKG_INS=${RD_PKG[$sh_pkg]}
fi
done
# 使用发行版中的包管理器安装系统中缺失的命令
for sh_cmd in ${!RD_CMD[*]}; do
which ${sh_cmd} &> /dev/null
if [ ! $? = 0 ]; then
sudo ${RD_PKG_INS} ${RD_CMD[$sh_cmd]}
fi
done