成功すれば stdout を command-A にリダイレクトし、そうでなければ stderr を command-b にリダイレクトします。また、一時ファイルを使用しないでください

成功すれば stdout を command-A にリダイレクトし、そうでなければ stderr を command-b にリダイレクトします。また、一時ファイルを使用しないでください

正常に実行した場合はstdoutに書き込み、誤って実行した場合はstderrに書き込むコマンドがあります。コマンドの終了ステータスを確認し、stdoutまたはstderrを使用していくつかのタスクを実行したいと思います。

if ! command >/tmp/stdout 2>/tmp/stderr; then
  // do something with /tmp/stderr
  exit 1
fi

// do something else with /tmp/stdout

もちろん、2つではなく1つのファイルしかありませんが、1つではなくすべてのファイルを削除したいと思います。

一時ファイルを防ぐ方法はありますか? mkfifoとカスタムファイル記述子を試してみましたが、機能が機能しませんでした。

答え1

$(..)条件付きでコマンド置換構文を使用して、コマンドが正常ifに実行されたことを確認し、コマンドの結果を変数に保存することもできますstdoutstderr

if ! var=$(cmd 2>&1); then
    printf 'process stderr contents from $var'
fi

cmdこれを行う単純なスクリプト実行をシミュレートすると、うまくいくことがわかります。

# cat temp.sh    
echo foo >&2
exit 1

スクリプトを実行すると

if ! var=$(bash tmp.sh 2>&1); then
    printf '%s\n' 'process stderr contents from $var'
    printf '%s\n' "$var"
fi

stdoutelseコマンド置換が成功した場合(上記の例のセクションで発生した場合)、同じ方法を使用してそれらをキャプチャできます。どちらの場合も、内容を操作すると"$var"(引用符があることを確認)、結果はファイルに保存されているかのように処理されます。

コマンド代替構文をさらに参照できます。いいえシェルに結果に対してトークン化を実行させます。たとえば、次のように進みます。ここに示すような単純なケースでは必要ありませんが、結果に特殊なシェルメタ文字が含まれている場合は必要ありません。

if ! var="$(bash tmp.sh 2>&1)"; then

注:回答の最初のバージョンが公開されてから、質問のタイトルが変更されました。

答え2

次のコードを使用できます

if [[ $? == 0 ]]
then
command 1>stdout.txt
else
echo "exit code is not successfull"
command 2> stderr.txt
fi

関連情報