![如果 yum install local rpm 是最新版本,则会抛出错误](https://linux22.com/image/712560/%E5%A6%82%E6%9E%9C%20yum%20install%20local%20rpm%20%E6%98%AF%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%EF%BC%8C%E5%88%99%E4%BC%9A%E6%8A%9B%E5%87%BA%E9%94%99%E8%AF%AF.png)
从本地文件目录安装 rpm 包时,第一次运行正常
sudo yum install packages/* -y --disablerepo=*
当同一件事作为自动脚本的一部分第二次运行时,它会引发错误(退出代码 1)
packages/package.rpm: does not update installed package.
Error: Nothing to do
我可以运行 yum update(退出代码 0)
sudo yum update packages/* -y --disablerepo=*
...
No packages marked for update
问题在于更新将跳过未安装的软件包。
如果这里存在任何实际问题,我不想忽略退出代码,只想执行install-or-update
。是否有rpm -i
等效方法可以实现此目的?请注意,这是在一组 rpm 包上完成的,这些包可能在任何时候都包含其他包。
我想一个选择是在 shell 脚本中对它们进行迭代并检查它们是否已安装,但再次依赖性解决可能会变得相当痛苦,而且听起来像是重新发明一辆自行车。
更新:
rpm --install
将根据失败包的数量抛出退出代码。
https://www.redhat.com/archives/rpm-list/2005-July/msg00071.html
rpm --freshen
将忽略任何以前未安装的 rpm,并且不提供任何输出。
答案1
在我的系统(centos6、centos7)上,“yum localinstall”即使出现“错误:无需执行任何操作”消息也会返回代码 0,而“yum install”则返回 1。
sudo yum localinstall packages/* -y --disablerepo=*
无论如何,您也可以检查消息结果以将其作为自动化脚本中的“正常错误”忽略,例如使用 bash:
sudo yum install packages/* -y --disablerepo=* 2>&1 | tee /tmp/yum.output
grep -q "Error: Nothing to do" /tmp/yum.output
if [ $? -eq 0 ]; then
... code for no error
else
... code for error
fi