编写脚本“手动”安装保留的软件包

编写脚本“手动”安装保留的软件包

总结:有没有办法“自动”安装任何保留的软件包?我知道这种方法apt-get dist-upgrade太不实用了。

细节...

我有一个 bash 脚本,它定期运行以保持 Ubuntu 桌面虚拟机保持一致状态。

它执行通常的apt-get update……apt-get upgrade例行事务。当然,也会定期扣留包裹。

到目前为止,我已经通过将保留的软件包添加到手动列表中来解决这个问题apt-get install <whatever was kept back>。我已经开始探索一种减少手动操作的方法。

当我发现自己(认真地)思考如何重构sudo apt-get -V upgrade | grep '=>' | grep -Ei '([A-Z]+(-)?)+' -o | sed 'N;s/\n/ /;'以提高可读性时,我突然想到也许有更好的方法。(是的......我也没有完全修复那一行中的错误)

上述可怕的事情是尝试提取(未版本化的)保留的包名称以便将它们动态地传递给apt-get install

所以,有没有更好的方法来识别保留的包并通过安装它们apt-get install

答案1

我对这个问题进行了更多的思考(并在此过程中学习了更多关于 sed 的知识)。我不相信这是最好的但这毕竟是一种方式。如果有人有更好的方法,回答,我很乐意接受您的回答。

sudo apt-get upgrade -s | sed -n '/back:/,/upgraded./p' | sed '1d;$d'

选项-s表示apt-get upgrade试运行,而不是实际安装。我将试运行输出文本通过管道传输到 sed,奇迹就发生了。在 sed 中,-n它使它安静下来,因此只有我告诉它打印的内容才会实际打印出来。什么要打印的内容由开始和结束的正则表达式定义。开始有一行匹配“back:”,并且结尾包含与“upgraded.”匹配的行。sed 语法一开始很棘手...linux突击队帮助我理解了基本的行范围选择。最后p告诉 sed“好的...现在打印”。

第一个 sed 的输出类似于:

下列包裹被保留下来:

事物1 事物2 新事物3

42 个已升级,7 个新安装,1 个删除,3 个未升级。

我管换成另一个更简单的 sed,它会删除第一行和最后一行 ( 1d;$d)。请注意,在第一个 sed 中有一些方法可以实现行偏移魔法,但我觉得这会让单个 sed 变得太混乱。我可以使用第二个 sed,它只留下:

事物1 事物2 新事物3

这些是需要手动安装的保留包。

kept_back_packages=$(sudo apt-get upgrade -s | sed -n '/back:/,/upgraded./p' | sed '1d;$d')
sudo apt-get install $kept_back_packages -y

-y对于脚本化的 apt-get 来说,这只是一个假设)。

笔记:

当没有保留的软件包时,它会妥善处理所有事情,不执行任何操作。将空字符串传递给 apt-get install,这样就没问题了。

相关内容