1. ホーム
  2. bash

[解決済み] 標準出力と標準エラー出力を異なる変数に取り込む

2023-03-18 20:01:38

質問

標準出力と標準エラー出力を 異なる変数 に格納することはできますか? 今、私はこれを、stdoutを out で、標準エラーは err を実行するとき some_command を実行したとき、しかし、私は を実行するとき、一時ファイルを回避したいです。

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 に一行ずつ保存され、改行が省略されます ( -t ) と 標準エラー $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

Debian wheezy で GNU バージョン 4.2.37(1)-release (i486-pc-linux-gnu) .