无法修改远程脚本时,如何合并stdout与stderr并双向输出?
解决方案
方法1:单命令即时合并双写
直接给目标命令套一层重定向,把stdout和stderr合并后同时输出到两个流:
your_command 2>&1 | tee /dev/stderr
2>&1:把stderr的内容转到stdout,实现两者合并tee /dev/stderr:把合并后的内容同时输出到stdout(tee默认输出)和stderr(写入/dev/stderr设备)
不管远程脚本检测到退出码是0还是非0,它显示的stdout或stderr里都会包含原始的所有输出信息。
方法2:全局批量设置重定向
如果要给多个命令统一配置,可以提前用exec做全局重定向:
exec > >(tee /dev/stderr) 2>&1 your_command # 后续其他命令也会自动应用这个输出规则
exec > >(tee /dev/stderr):把之后所有命令的stdout指向一个进程,这个进程会把内容同时输出到stdout和stderr2>&1:把stderr也重定向到这个进程,确保所有输出都被双写
关于退出码的补充
默认情况下tee的退出码是0,会覆盖原始命令的退出码。如果需要远程脚本能拿到原始命令的真实退出码,加上pipefail选项:
set -o pipefail your_command 2>&1 | tee /dev/stderr
这样管道的退出码会等于原始命令的退出码,不会影响远程脚本的判断逻辑。
内容的提问来源于stack exchange,提问作者LoicM
相关产品推荐
相关产品推荐

