我正在尝试编写一个安装软件包的脚本,但是如果在脚本稍后的任何时候失败,则会回滚它安装的任何内容。当然,如果用户之前已经安装了一个软件包,我不想将其从其下卸载。我的脚本如何判断某个软件包之前是否已通过 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
将语句替换为对true
and 的调用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 遇到的问题类型。如果您想在出现问题时采取不同的操作,这是一个好方法。