APT命令无法升级被保留的软件包,求便捷升级方案
APT命令无法升级被保留的软件包,求便捷升级方案
兄弟我太懂你这种每次升级都卡壳的郁闷了!每次老老实实跑sudo apt-get update && sudo apt-get upgrade,结果总有十来个包被标记为“kept back”,试了带--with-new-pkgs的升级、dist-upgrade都没反应,只能手动复制粘贴包名去install,结果要么终端复制格式乱了,要么自己手滑打错字,简直浪费时间又闹心!
给你几个不用手动折腾的解决方案,亲测好用:
1. 一键提取并升级所有被保留的包
直接运行这条命令,它会自动识别出所有处于“kept back”状态的包,然后帮你安装升级:
sudo apt-get install $(apt list --upgradable 2>/dev/null | grep -v "^Listing..." | cut -d/ -f1)
原理是apt list --upgradable列出所有可升级的包(包括被保留的),然后过滤掉无关信息,提取出包名传递给install命令。
2. 试试更友好的apt full-upgrade
你之前用的dist-upgrade其实有个新别名full-upgrade,虽然功能差不多,但有时候在处理依赖上会更灵活,不妨试试:
sudo apt update && sudo apt full-upgrade
如果还是不行,可能这些包存在依赖冲突或者被特殊配置锁定了,你可以先查下这些包的版本状态,看看是不是有第三方源或者版本锁定的问题:
apt-cache policy coreutils libpulse-dev libpulse-mainloop-glib0 libpulse0 libpulse0:i386 libpulsedsp pulseaudio-utils snapd update-notifier update-notifier-common
从输出里能看到这些包可获取的版本、当前安装版本,以及对应的源,方便排查原因。
3. 写个小脚本一键搞定
要是上面的命令还满足不了你,那就整个小脚本自动化,以后一键运行就行:
把下面的内容保存成upgrade-kept.sh文件:
#!/bin/bash # 提取被保留的包名 KEPT_PACKAGES=$(apt-get upgrade -s | awk '/The following packages have been kept back:/{getline; while(NF>0){print $0; getline}}' | tr '\n' ' ') if [ -n "$KEPT_PACKAGES" ]; then echo "开始升级被保留的包:$KEPT_PACKAGES" sudo apt-get install $KEPT_PACKAGES -y else echo "没有被保留的包,系统已经是最新状态啦!" fi
然后给脚本加执行权限:
chmod +x upgrade-kept.sh
以后每次升级,直接运行./upgrade-kept.sh就搞定了,完全不用手动复制粘贴!
备注:内容来源于stack exchange,提问作者jophuh
相关产品推荐
相关产品推荐

