![成功した場合はstdoutをコマンドAにリダイレクトし、成功しなかった場合はstderrをコマンドbにリダイレクトします。一時ファイルの使用は避けます。](https://rvso.com/image/164722/%E6%88%90%E5%8A%9F%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AFstdout%E3%82%92%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89A%E3%81%AB%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%97%E3%80%81%E6%88%90%E5%8A%9F%E3%81%97%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AFstderr%E3%82%92%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89b%E3%81%AB%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E4%B8%80%E6%99%82%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%BF%E7%94%A8%E3%81%AF%E9%81%BF%E3%81%91%E3%81%BE%E3%81%99%E3%80%82.png)
正常であれば 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
、コマンドが正常に実行されたかどうかを確認し、コマンドの結果を変数にstdout
格納することができます。stderr
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
同じ方法で、stdout
コマンド置換が成功したかどうかをキャプチャすることもできますelse
。これは、上記の例の句で発生します。どちらの場合でも、"$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