存储/捕获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上测试,

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...