2017-07-21 6 views
2

私はいくつかのbashスクリプト出力をリダイレクトしようとしています。私がやりたいwhould何 は次のとおりです。stderrとstderrをリダイレクトしながら、bashの別のファイルにstderrをコピーする

./some_script.sh 2> error.log >> all_output.log 2>&1 

私は別のファイル上のファイルに標準エラー出力を入れ、とstderrとstdoutの両方が好きwhould。

さらに、all_output.logの最後に追加したい(問題のないerror.logの場合)。

しかし、私は正しい構文が得られません。私はたくさんのことを試してきました。私は正しいことを見つけることができませんでした。

ありがとうございました! :)

答えて

2

リダイレクトステートメント(> fooまたは2> barまたは1>&2など)は、ファイル記述子への割り当てと同様に、左から右に実行するのが最も適しています。

2> error.log 

手段::fd2 = open_for_writing('error.log')

>> all_output.log 

手段:fd1 = open_for_appending('all_output.log')

2>&1 

手段:あなたのコードは、このない。これによりfd2 = fd1

をあなたは2> error.log(最初の文ということを理解することができます)は、おそらく(空の)error.logを作成する以外の効果はありません。

2つの異なるターゲットに1つのストリームを実現します。それは単なるリダイレクトではありません。そのためには、1つのことを読んでそれを2つの異なるストリームに書き込むプロセスが必要です。それはtee(1)を使用するのが最善です。

残念ながらストリームを他のプロセスに渡すのはパイプ経由で行われ、stderoutではなくstdoutを渡すだけです。あなたの目標を達成するためには、stderrとstdoutを最初に入れ替える必要があります。

呼び出しはこのようになります。その結果、完全な:

(./some_script.sh 3>&2 2>&1 1>&3 | tee error.log) >> all_outputlog 2>&1 
+1

おかげでたくさん、あなたは私の一日行わ! 私はあまりにも厄介だったと思います – Xerock

+0

@Xerockそして、あなたは22222(私は22237です)の私の素晴らしい評判を台無しにしました。私はそれについて不幸ではないが、;-) – Alfe

+1

すごい答え@Alfeは完全に説明した – skr

関連する問題