Bash中如何捕获命令多行输出至变量并屏蔽控制台输出?
解决命令多行输出完整捕获与控制台屏蔽问题
我来帮你搞定这个问题!你遇到的核心问题是:uncrustify的部分输出并没有被$(...)捕获,反而直接跑到控制台了——这是因为它把Parsing: filename as language OC这行输出到了标准错误流(stderr),而默认情况下命令替换$(...)只会捕获标准输出流(stdout)。
解决方案:重定向stderr到stdout
要完整捕获所有输出,同时屏蔽控制台的任何输出,只需要给uncrustify命令加上2>&1,把stderr的内容重定向到stdout,这样所有输出都会被命令替换捕获并存入变量。
修正后的heredoc写法
#!/bin/bash output="$( bash <<EOF echo abc # 关键:添加2>&1将stderr合并到stdout uncrustify -c ~/.uncrustify.cfg --check filename 2>&1 echo def EOF )" # 打印变量验证(不需要的话可以删除此行) echo "$output"
更简洁的写法(无需heredoc)
如果只是执行一系列命令,用分号分隔直接写在命令替换里更清爽:
#!/bin/bash output="$(echo abc; uncrustify -c ~/.uncrustify.cfg --check filename 2>&1; echo def)" # 验证变量内容 echo "$output"
效果验证
运行脚本后,控制台不会输出任何uncrustify的内容,output变量里会完整包含所有内容:
abc Parsing: filename as language OC FAIL: filename (File size changed from 404 to 417) def
单独捕获uncrustify输出
如果只需要捕获uncrustify的所有输出,直接这样写即可:
uncrustify_output="$(uncrustify -c ~/.uncrustify.cfg --check filename 2>&1)"
内容的提问来源于stack exchange,提问作者Piotr Wasilewicz
相关产品推荐
相关产品推荐

