私は似たようなことをしたい:
command || log $error_from_last_command
パイプのように使い||
ながらもアクセスし続ける方法はありますか?stderr
command
私の意図はのエラーメッセージを処理することですがlog
、失敗した場合にのみ該当しますcommand
。表示されたコピーを読んでいますが、私のケースにどのように適用するのかわかりません。
答え1
最初のコマンドが完了した後にのみ実行される他のプログラムでプログラムの出力を使用したい場合は、出力をファイルに保存するのがおそらく最も簡単な方法です。
errfile=$(mktemp)
if ! somecommand 2> "$errfile" ; then
log < "$errfile" # or log "$(cat "$errfile")" ?
fi
rm "$errfile"
出力をパイプするには、コマンドを同時に実行する必要がありますが、最初のコマンドが完了したときにのみ終了コードを取得します。
log < "$errfile"
もちろん、上記はエラーメッセージを標準入力に渡しますlog
(パイプを使用するのと同じように)。コマンドライン引数として渡すには、log "$(cat "$errfile")"
(1つの引数)またはlog $(cat "$errfile")
(インジェクションの使用、複数の引数をlog
参照)、またはlog "$(< "$errfile")"
(非標準、少なくともBashで動作します)を使用します。
答え2
次のことを知っているだけで、あなたの目的に十分であれば終了コードbash
パイプの最初の要素(またはパイプのすべての要素)でこの変数を使用できます。マニュアルページPIPESTATUS
によると、この変数には、bash
「配列変数...プロセスの終了ステータス値のリストが含まれています。最後に実行されたフロントエンドパイプライン...」。
技術的には少し異なることが必要であることがわかりますが、この変数を使用すると、最初に予期しない方法で要件を満たすことができるかどうかを検討できます。