总结:有没有办法“自动”安装任何保留的软件包?我知道这种方法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,这样就没问题了。