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


75

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

Answers:


76

我在一个半相关的StackOverflow问题上发现了以下内容;我需要的答案实际上并没有完全回答该问题(因此没有被选择为正确答案),所以我认为我会将其发布在这里,以便其他人更容易找到。

yum list installed PACKAGE_NAME

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

由于输出有些违反直觉,因此我在包装函数中使用了@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和替换的语句false有助于使函数更具可读性/直观性,同时返回bash期望的值(即0表示true,1表示false)。

如果您只是在脚本中检查一个包,则直接进行测试可能会更好yum list installed,但是(IMHO)该功能可以使您更轻松地了解正在发生的事情,并且其语法比yum所有重定向都容易记住抑制其输出。


2
您无需手动检查的值$?,只需将命令包装在以下条件中即可:if yum list installed "$package" >/dev/null 2>&1; then [...]
Chris Down

1
我认为您的回声陈述是相反的,不是吗?isInstalled如果安装了软件包,则返回1;否则返回1。但是在bash中1被评估为false,因此回显了“未安装”。
FGreg 2015年

@FGreg良好的通话...我已经取代了return与调用语句truefalse,因此函数易读又返回输出bash的预期。
Doktor J

5
OMG是21世纪,他们不能提供一个合适的选项来告知是否已安装软件包,所以我没有写功能或一个内衬!
Sunil D.

21

不能完全满足问题“通过yum”的前提条件,但比“ yum -q list”要快:

rpm -q <package_name>

它返回可能已安装版本的确切名称,如果已安装则返回错误代码“ 0”,否则返回“ 1”。


+1,因为速度更快
房地美(Freddie Fabregas)

绝对快,因为rpm是本地软件包管理器。yum用于处理远程存储库中的软件包
Sergiy Kolodyazhnyy

9

更简单的oneliner:

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

0

yum的便捷脚本:

#!/bin/sh pckarr=(wget mlocate bind-utils ANY_RANDOM_PACKAGE_NAME) yum update -y for i in ${pckarr[*]} do isinstalled=$(rpm -q $i) if [ ! "$isinstalled" == "package $i is not installed" ]; then echo Package $i already installed else echo $i is not INSTALLED!!!! yum install $i -y fi done updatedb

在pckarr阵列中,列出要安装的软件包或检查是否已安装。


0

您还可以$?从yum中读取返回值。如果一切正常,则应为0,否则应为正数,具体取决于yum遇到的问题。如果您要在发生故障时采取其他措施,这是一个好方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.