DrA*_*rAl 19 distros shell package-management
有没有办法(从脚本)来识别默认的系统包管理器?
澄清一下,我想要做的是运行一个给定的命令,在 Debian 或其任何衍生产品上它会返回类似“apt”的东西,在 openSUSE 上它会返回“zypp”,在 Fedora 等上它会返回“yum”,在 Arch Linux 上它会返回“pacman”等。
我知道我可以用下面的方法来做到这一点,我只是想知道是否有一种更强大的方法,只要有同名的可执行文件就不会中断。
which apt >/dev/null 2>&1
if [ $? -eq 0 ]
then
echo "apt"
fi
# etc...
Run Code Online (Sandbox Code Playgroud)
dai*_*isy 11
你应该从识别发行版开始,而不是识别二进制程序,
只需给您几行适用于 bash 脚本的行:
declare -A osInfo;
osInfo[/etc/redhat-release]=yum
osInfo[/etc/arch-release]=pacman
osInfo[/etc/gentoo-release]=emerge
osInfo[/etc/SuSE-release]=zypp
osInfo[/etc/debian_version]=apt-get
for f in ${!osInfo[@]}
do
if [[ -f $f ]];then
echo Package manager: ${osInfo[$f]}
fi
done
Run Code Online (Sandbox Code Playgroud)
尽管这些部分是不可信的,但通常人们不会这样做。
小智 10
在审查了其他路线后,我选择了走这条路线。当我运行许多 docker 容器并需要curl / jq 并且无法依赖工作之间可用的内容时,就会出现这种情况。
script:
- packagesNeeded='curl jq'
- if [ -x "$(command -v apk)" ]; then sudo apk add --no-cache $packagesNeeded
- elif [ -x "$(command -v apt-get)" ]; then sudo apt-get install $packagesNeeded
- elif [ -x "$(command -v dnf)" ]; then sudo dnf install $packagesNeeded
- elif [ -x "$(command -v zypper)" ]; then sudo zypper install $packagesNeeded
- else echo "FAILED TO INSTALL PACKAGE: Package manager not found. You must manually install: $packagesNeeded">&2; fi
Run Code Online (Sandbox Code Playgroud)
在纯 bash 中:
packagesNeeded=(curl jq)
if [ -x "$(command -v apk)" ];
then
sudo apk add --no-cache "${packagesNeeded[@]}"
elif [ -x "$(command -v apt-get)" ];
then
sudo apt-get install "${packagesNeeded[@]}"
elif [ -x "$(command -v dnf)" ];
then
sudo dnf install "${packagesNeeded[@]}"
elif [ -x "$(command -v zypper)" ];
then
sudo zypper install "${packagesNeeded[@]}"
else
echo "FAILED TO INSTALL PACKAGE: Package manager not found. You must manually install: "${packagesNeeded[@]}"">&2;
fi
Run Code Online (Sandbox Code Playgroud)
您还可以直接测试退出状态command -v
:
if command -v apk &> /dev/null
then
sudo apk add ...
fi
Run Code Online (Sandbox Code Playgroud)
从这个问题的公认答案开始:How can I get distribution name and version number in a simple shell script? . 然后,根据检测到的分发决定要使用的包管理器。
归档时间: |
|
查看次数: |
36324 次 |
最近记录: |