运行命令时如何在保留控制台输出的同时捕获stderr到变量?
捕获命令stderr到变量同时保留控制台输出
要实现同时将stdout、stderr输出到对应控制台流,且把stderr内容存入变量的需求,可通过bash的进程替换和重定向完成,以下是两种实用写法:
简洁实现(bash 4.0+)
直接利用进程替换结合tee,让stderr同时输出到控制台错误流并被变量捕获:
# 替换成你实际要执行的命令 stderr_content=$(your_command 2> >(tee /dev/stderr))
逻辑说明
2> >(tee /dev/stderr):将命令的stderr重定向到tee进程,tee会把接收到的内容同时输出到控制台的标准错误流(/dev/stderr),以及输出到stdout;外层的$(...)会捕获这部分stdout内容,存入stderr_content变量。- 命令的stdout会直接输出到控制台,不受任何影响。
兼容旧版bash的实现
如果需要兼容bash 4.0以下版本,可使用临时文件描述符来实现:
# 执行命令并完成捕获与输出 stderr_content=$(your_command 2>&1 >&3 3>&- | tee /dev/stderr) 3>&1
逻辑说明
3>&1:先创建临时文件描述符3,指向当前的控制台stdout;2>&1 >&3:将stderr重定向到管道(供$(...)捕获),同时把原stdout重定向到描述符3(直接输出到控制台);tee /dev/stderr:把管道中的stderr内容输出到控制台错误流,同时保留内容供$(...)捕获;- 最后
3>&1关闭临时描述符3。
验证示例
假设执行命令ls non_existent_file existing_file(existing_file为本地存在的文件):
- 控制台会输出
existing_file(stdout内容),同时输出ls: cannot access 'non_existent_file': No such file or directory(stderr内容); - 变量
stderr_content中会存储上述stderr的错误信息。
内容的提问来源于stack exchange,提问作者Yair Halberstadt
相关产品推荐
相关产品推荐

