gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:43:09 24 4
gpt4 key购买 nike

是否可以在不使用临时文件的情况下以不同的变量存储或捕获stdout和stderr?现在我这样做是为了在运行out时获得err中的stdout和some_command中的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)替换为实际命令。通过省略换行符( $t_std)和stderr到 -t中,将stdout的输出保存到 $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 4.2.37(1)-发行版(i486-pc-linux-gnu)在Debian wheezy上进行了测试。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com