是否可以在不使用tempfile的情况下在不同的变量中存储或捕获stdout和stderr?现在我做这个是为了在运行some_command时将stdout和stderr设置为err,但是我会
喜欢避免temp文件。
喜欢避免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上测试,