微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/bash/390331.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐