如何判断一个包是否通过 yum 安装在 bash 脚本中?

Dok*_*r J 84 bash yum shell-script package-management

我正在尝试编写一个安装包的脚本,但如果它在稍后的任何时候失败,脚本会回滚它安装的任何内容。当然,如果用户之前已经安装了一个包,我不想从他们下面卸载它。我的脚本如何判断一个包以前是否通过 yum 安装过?

Dok*_*r J 85

我在一个半相关的StackOverflow 问题上发现了以下内容;我需要的答案实际上并没有完全回答那里的问题(并且没有被选为正确答案)所以我想我会把它贴在这里让其他人更容易找到。

yum list installed PACKAGE_NAME

这个命令返回一些人类可读的输出,但更重要的是返回一个退出状态代码;0 表示安装包,1 表示安装包(不检查包是否有效,因此yum list installed herpderp-beepbopboop将返回“1”,就像yum list installed traceroute未安装 traceroute 一样)。您可以随后检查“$?” 对于此退出代码。

由于输出有点违反直觉,我在包装函数中使用了@Chris Downs 的“精简”版本,使输出更“合乎逻辑”(即 1=已安装 0=未安装):

function isinstalled {
  if yum list installed "$@" >/dev/null 2>&1; then
    true
  else
    false
  fi
}
Run Code Online (Sandbox Code Playgroud)

用法是

if isinstalled $package; then echo "installed"; else echo "not installed"; fi

编辑:

return用对trueand 的调用替换语句,false这有助于使函数更具可读性/直观性,同时返回 bash 期望的值(即 0 表示真,1 表示假)。

如果你只是在你的脚本中检查一个包,你可能最好yum list installed直接测试,但是(恕我直言)这个函数更容易理解发生了什么,并且它的语法比yum所有重定向更容易记住以抑制其输出。

  • 天哪,现在是 21 世纪,难道他们不能有一个适当的选项来判断是否安装了软件包,因此我没有写入功能或一个衬垫!? (5认同)
  • 您不需要手动检查 `$?` 的值,只需将命令包装在条件中:`if yum list installed "$package" >/dev/null 2>&1; 然后[...]` (2认同)

小智 26

不完全满足“通过 yum”问题的先决条件,但比“yum -q list”更快的是:

rpm -q <package_name>
Run Code Online (Sandbox Code Playgroud)

它返回可能安装的版本的确切名称以及错误代码“0”(如果已安装)和“1”(如果未安装)。


小智 10

更简单的单线:

yum -q list installed packageX &>/dev/null && echo "Installed" || echo "Not installed"
Run Code Online (Sandbox Code Playgroud)