Bash技巧:解析命令stderr输出且无对应命令时不显示错误
解析命令stderr同时屏蔽执行错误的Bash通用技巧
要实现解析命令的stderr输出,同时在命令不存在或执行失败时不显示任何错误信息,可以用以下几种通用的Bash技巧:
1. 代码块重定向(最通用)
把目标命令放在大括号(或子shell)中,先将命令自身的stderr重定向到stdout(供后续工具如sed解析),再将整个代码块的stderr重定向到/dev/null,以此屏蔽命令不存在或执行出错时的系统错误提示:
{ python2 -V 2>&1; } 2>/dev/null | sed 's/.* \([0-9]\).\([0-9]\).*/\1\2/'
- 大括号
{ ...; }将python2 -V 2>&1作为一个整体,2>/dev/null会屏蔽这个整体产生的所有错误(包括shell找不到python2的提示) - 内部的
2>&1则把python2 -V原本输出在stderr的版本信息重定向到stdout,传递给后面的sed处理 - 如果
python2不存在,整个代码块的错误被丢弃,sed没有输入,自然无输出;如果存在,sed正常解析版本号
2. 短路判断(简洁直观)
利用Bash的短路与&&,先检查命令是否存在,再执行解析逻辑,从根源避免错误输出:
command -v python2 >/dev/null && python2 -V 2>&1 | sed 's/.* \([0-9]\).\([0-9]\).*/\1\2/'
command -v python2用于检查python2是否存在,结果重定向到/dev/null避免输出- 只有当检查通过(命令存在)时,才会执行后面的版本解析命令,完全不会触发“命令不存在”的错误提示
3. 过滤错误行(针对性强)
如果能预判错误信息的格式,可以在sed中直接过滤掉错误行,但这种方式通用性稍弱(不同系统的错误提示可能不同):
python2 -V 2>&1 | sed '/command not found/d; s/.* \([0-9]\).\([0-9]\).*/\1\2/'
- 先通过
/command not found/d删除包含错误提示的行,再处理正常的版本信息 - 缺点是如果系统错误提示不是“command not found”,就无法过滤
内容的提问来源于stack exchange,提问作者OscarAkaElvis
相关产品推荐
相关产品推荐

