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

前端之家收集整理的这篇文章主要介绍了存储/捕获stdout和stderr在不同的变量(bash)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否可以在不使用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上测试,

猜你在找的Bash相关文章