Bash中apt-cache show命令输出无法存入变量的问题
解决apt-cache show虚拟包输出无法捕获的问题
问题说明
运行apt-cache show debconf-2.0时,终端能正常输出以下内容:
N: Can't select versions from package 'debconf-2.0' as it is purely virtual
N: No packages found
但在脚本里用$()捕获输出时,哪怕加上2>&1重定向stderr,变量依然是空的。测试普通包(比如nano)时,cmd_output=$(apt-cache show nano 2>&1)能正常获取到包信息,说明问题只出在虚拟包的情况上。
核心解决办法
apt-cache在非交互式环境(比如脚本的子shell)下,默认会抑制低优先级的提示信息。只需添加-q=0参数强制输出所有提示,再结合2>&1就能捕获完整输出:
cmd_output=$(apt-cache show debconf-2.0 -q=0 2>&1) echo "$cmd_output"
捕获到输出后,就能用grep判断是否为虚拟包:
if echo "$cmd_output" | grep -q "is purely virtual"; then echo "该包是虚拟包" fi
其他判断虚拟包的方法
- 用apt-cache showpkg:虚拟包的输出会显示
Provides:字段,但没有实体包的版本、大小等信息:apt-cache showpkg debconf-2.0 - 用dpkg-query:虚拟包不会返回任何结果(注意:未安装的实体包也会空,需结合其他判断):
dpkg-query -W -f='${Package}\n' debconf-2.0 2>/dev/null - 用aptitude(需先安装):虚拟包会明确标注
State: not a real package:aptitude show debconf-2.0
内容的提问来源于stack exchange,提问作者tygo
相关产品推荐
相关产品推荐

