bash - 将 stdout 和 stderr 捕获到不同的变量中

标签 bash shell command-line io-redirection

是否可以在不同的变量中存储或捕获 stdout 和 stderr,而不使用临时文件?现在我这样做是为了在运行 some_command 时在 out 中获取 stdout 并在 err 中获取 stderr,但我会 喜欢避免使用临时文件。

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) 的行为,除了 $? 的值将我们带到最后修改:

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 在 Debian wheezy 上测试,版本 4.2.37(1)-release (i486-pc-linux-gnu) .

关于bash - 将 stdout 和 stderr 捕获到不同的变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11027679/

相关文章:

bash - 在 Bash 中每 6 分钟运行一次命令

linux - 使用 shell 脚本检查文件是否为 jpeg 格式

python - 如何在内核终端内运行带有库的Python脚本?

linux - 解析ls,不推荐

macos - 在 Mac 和流媒体上使用 ffmpeg 捕获麦克风输入

maven - 如何从Maven传递Java代码参数进行测试

python - crontab 运行一个运行多个 python 脚本的 bash 脚本

python - 在Linux上自动安装conda

linux - BASH:- 将字符串解析为单独的命令行参数

linux - Bash(对于基础来说值(value)太大)