加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读