bash – 如何在不停止写入终端的情况下复制stderr?
发布时间:2020-12-15 18:19:01 所属栏目:安全 来源:网络整理
导读:我想编写一个运行命令的 shell脚本,在它到达时将其stderr写入终端.但是,我还想将stderr保存到变量中,以便稍后检查. 我怎样才能做到这一点?我应该使用T恤,子壳还是其他东西? 我试过这个: # Create FD 3 that can be used so stdout still comes through ex
我想编写一个运行命令的
shell脚本,在它到达时将其stderr写入终端.但是,我还想将stderr保存到变量中,以便稍后检查.
我怎样才能做到这一点?我应该使用T恤,子壳还是其他东西? 我试过这个: # Create FD 3 that can be used so stdout still comes through exec 3>&1 # Run the command,piping stdout to normal stdout,but saving stderr. { ERROR=$( $@ 2>&1 1>&3) ; } echo "copy of stderr: $ERROR" 但是,这不会将stderr写入控制台,它只会保存它. 我也尝试过: { $@; } 2> >(tee stderr.txt >&2 ) echo "stderr was:" cat stderr.txt 但是,我不想要临时文件. 解决方法
归功于@Etan Reisner关于该方法的基本原理;但是,最好将tee与/ dev / stderr而不是/ dev / tty一起使用以保持正常行为(如果发送到/ dev / tty,外部世界不会将其视为stderr输出,并且既不能捕获也不压抑它):
这是完整的成语: exec 3>&1 # Save original stdout in temp. fd #3. # Redirect stderr to *captured* stdout,send stdout to *saved* stdout,also send # captured stdout (and thus stderr) to original stderr. errOutput=$("$@" 2>&1 1>&3 | tee /dev/stderr) exec 3>&- # Close temp. fd. echo "copy of stderr: $errOutput" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |