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

存储/捕获stdout和stderr在不同的变量(bash)

发布时间:2020-12-15 16:14:03 所属栏目:安全 来源:网络整理
导读:是否可以在不使用tempfile的情况下在不同的变量中存储或捕获stdout和stderr?现在我做这个是为了在运行some_command时将stdout和stderr设置为err,但是我会 喜欢避免temp文件。 error_file=$(mktemp)out=$(some_command 2$error_file)err=$( error_file)rm $
是否可以在不使用tempfile的情况下在不同的变量中存储或捕获stdout和stderr?现在我做这个是为了在运行some_command时将stdout和stderr设置为err,但是我会
喜欢避免temp文件。
error_file=$(mktemp)
out=$(some_command 2>$error_file)
err=$(< error_file)
rm $error_file
好吧,它有点丑,但这里是一个解决方案:
unset t_std t_err
eval "$( (echo std; echo err >&2) 2> >(readarray -t t_err; typeset -p t_err) > >(readarray -t t_std; typeset -p t_std) )"

其中(echo std; echo err>& 2)需要由实际命令替换。 stdout的输出保存到数组t_std中,通过省略换行符(-t)和stderr到t_err中。

如果你不喜欢数组,你可以做

unset t_std t_err
eval "$( (echo std; echo err >&2 ) 2> >(t_err=$(cat); typeset -p t_err) > >(t_std=$(cat); typeset -p t_std) )"

这几乎模仿了var = $(cmd)的行为,除了$的值?它带我们到最后一个modfication:

unset t_std t_err t_ret
eval "$( (echo std; echo err >&2; exit 2 ) 2> >(t_err=$(cat); typeset -p t_err) > >(t_std=$(cat); typeset -p t_std); t_ret=$?; typeset -p t_ret )"

这里$?我保存到$ t_ret

使用GNU bash,版本4.2.37(1) – 释放(i486-pc-linux-gnu)在Debian wheezy上测试,

(编辑:李大同)

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

    推荐文章
      热点阅读