如何判断某个软件包是否是通过 bash 脚本中的 yum 安装的?

如何判断某个软件包是否是通过 bash 脚本中的 yum 安装的?

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

答案1

我在半相关的网站上发现了以下内容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
}

用法是

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

编辑:

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

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

答案2

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

rpm -q <package_name>

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

答案3

更简单的单行:

yum -q list installed packageX &>/dev/null && echo "Installed" || echo "Not installed"

答案4

$?您还可以从 yum读取返回值。如果一切正常则应为 0,否则应为正值,具体取决于 yum 遇到的问题类型。如果您想在出现问题时采取不同的操作,这是一个好方法。

相关内容