stdout をBashの切り捨てられたファイルにリダイレクトするために、私は使うことを知っています:
cmd > file.txt
ファイルに追加して、 stdout をBashにリダイレクトするには、次のようにします。
cmd >> file.txt
stdout と stderr の両方を切り捨てたファイルにリダイレクトするには、次のようにします。
cmd &> file.txt
stdout と stderr の両方をファイルに追加してリダイレクトするにはどうすればよいですか? cmd &>> file.txt
は私にとってうまくいきませんでした。
cmd >>file.txt 2>&1
Bashは以下のように左から右へリダイレクトを実行します。
>>file.txt
:追加モードでfile.txt
を開き、そこでstdout
をリダイレクトします。2>&1
:stderr
を "stdout
が現在進行中" にリダイレクトします。この場合、それは追加モードで開かれたファイルです。言い換えれば、&1
はstdout
が現在使用しているファイル記述子を再利用します。Bashのバージョンに応じて、これを行うには2つの方法があります。
古典的で移植性のある( Bash pre-4 )方法は、次のとおりです。
cmd >> outfile 2>&1
で始まる移植不可能な方法Bash 4 は
cmd &>> outfile
(&> outfile
に類似)
良いコーディングスタイルのためには、
スクリプトが既に#!/bin/sh
で始まっている場合(意図的かどうかにかかわらず)、Bash 4の解決策、そして一般的にはBash特有のコードは、うまくいく方法ではありません。
また、Bash 4の&>>
は単なる短い構文であることを覚えておいてください - 新しい機能やそれに類するものは導入されていません。
構文は(他のリダイレクト構文の他に)ここに記述されています: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output
Bashでは、リダイレクトを別のファイルに明示的に指定することもできます。
cmd >log.out 2>log_error.out
追加は次のようになります。
cmd >>log.out 2>>log_error.out
Bash 4(およびZSH 4.3.11)では、
cmd &>>outfile
箱から出して
これはうまくいくはずです。
your_command 2>&1 | tee -a file.txt
それはすべてのログを file.txt に保存するだけでなく、それらを端末にダンプします。
これを試して
You_command 1>output.log 2>&1
&> x.fileの使い方はbash4では機能します。そのために残念 : (
0、1、2 ... 9はbashのファイル記述子です。
0はstdin
、1はstdout
、2はstderror
を表します。 3〜9は他の一時的な使用のための予備です。
演算子>
または>>
を使用して、任意のファイル記述子を他のファイル記述子またはファイルにリダイレクトできます(追加)。
使用法: < file_descriptor > > < filename | &file_descriptor >
http://www.tldp.org/LDP/abs/html/io-redirection.html を参照してください。
私が驚いたのは、このアプローチを投稿した人が10年近くも前にいないことです。
&>>
が利用できない古いバージョンのbashを使用している場合は、次のこともできます。
(cmd 2>&1) >> file.txt
これはサブシェルを生み出すので、cmd >> file.txt 2>&1
の伝統的なアプローチよりも効率的ではありませんが、このアプローチは私にとってより自然で理解しやすい感じです:
また、特に標準出力と標準エラー出力を別のコマンドに渡す場合は、括弧を使用して順序のあいまいさを取り除きます。