当xargs输入为空时如何执行默认命令?
问题
我正在编写一个bash脚本用于管理所有软件包,包括更新、升级所有可升级的apt和flatpak包,以及清理无用包。其中一行使用xargs自动对所有可升级包执行升级命令,无需使用while循环,希望在没有可升级包时输出“No packages to upgrade”。我尝试了以下命令但未生效:
apt-get -s --no-download upgrade -V | grep '=>' | awk '{print $1}' | { sudo xargs --no-run-if-empty apt-get --only-upgrade upgrade -y } || { echo "No package to upgrade" }
请问是否有办法在xargs输入为空时执行默认命令?
解决方案
你的命令没生效的核心原因:xargs --no-run-if-empty 在输入为空时会返回0(成功状态码),而非错误码,所以后面的||分支根本不会触发执行。
给你两种实用的实现方式:
方法一:先捕获包列表再判断
先把可升级的包名存到变量里,再根据变量是否为空做处理,逻辑清晰且易维护:
UPGRADABLE_PKGS=$(apt-get -s --no-download upgrade -V | grep '=>' | awk '{print $1}') if [ -n "$UPGRADABLE_PKGS" ]; then echo "$UPGRADABLE_PKGS" | sudo xargs apt-get --only-upgrade upgrade -y else echo "No packages to upgrade" fi
方法二:用grep先判断是否有可升级包
先通过grep -q检查有没有可升级的包,再决定执行升级还是提示,避免重复解析输出:
if apt-get -s --no-download upgrade -V | grep -q '=>'; then apt-get -s --no-download upgrade -V | grep '=>' | awk '{print $1}' | sudo xargs apt-get --only-upgrade upgrade -y else echo "No packages to upgrade" fi
额外提示
- 执行升级前务必先运行
apt update,否则apt-get -s检测到的可升级包列表可能不是最新的 --only-upgrade参数能确保只升级已安装的包,不会额外安装新依赖,适合脚本自动化场景
内容的提问来源于stack exchange,提问作者Johan Daniel
相关产品推荐
相关产品推荐

