Shell

辨識系統包管理器

  • March 7, 2022

有沒有辦法(從腳本)來辨識預設的系統包管理器?

澄清一下,我想要做的是執行一個給定的命令,在 Debian 或其任何衍生產品上它會返回類似“apt”的東西,在 openSUSE 上它會返回“zypp”,在 Fedora 等上它會返回“yum”,在 Arch Linux 上它會返回“pacman”等。

我知道我可以用類似下面的方法來做到這一點,我只是想知道是否有一種更強大的方法,只要有同名的執行檔就不會中斷。

which apt >/dev/null 2>&1
if [ $? -eq 0 ]
then
   echo "apt"
fi
# etc...

從這個問題的公認答案開始:如何在簡單的 shell 腳本中獲取分發名稱和版本號?. 然後,根據檢測到的分佈決定您要使用哪個包管理器。

您應該從辨識發行版開始,而不是辨識二進製程序,

只需給您幾行在 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
osInfo[/etc/alpine-release]=apk

for f in ${!osInfo[@]}
do
   if [[ -f $f ]];then
       echo Package manager: ${osInfo[$f]}
   fi
done

儘管這些部分是不可信的,但通常人們不會那樣做。

引用自:https://unix.stackexchange.com/questions/46081