web-dev-qa-db-ja.com

どうすればBashでstdoutとstderrの両方をリダイレクトしてファイルに追加することができますか?

stdout をBashの切り捨てられたファイルにリダイレクトするために、私は使うことを知っています:

cmd > file.txt

ファイルに追加して、 stdout をBashにリダイレクトするには、次のようにします。

cmd >> file.txt

stdout stderr の両方を切り捨てたファイルにリダイレクトするには、次のようにします。

cmd &> file.txt

stdout stderr の両方をファイルに追加してリダイレクトするにはどうすればよいですか? cmd &>> file.txtは私にとってうまくいきませんでした。

1356
flybywire
cmd >>file.txt 2>&1

Bashは以下のように左から右へリダイレクトを実行します。

  1. >>file.txt:追加モードでfile.txtを開き、そこでstdoutをリ​​ダイレクトします。
  2. 2>&1stderr "stdoutが現在進行中" にリダイレクトします。この場合、それは追加モードで開かれたファイルです。言い換えれば、&1stdoutが現在使用しているファイル記述子を再利用します。
1709
Alex Martelli

Bashのバージョンに応じて、これを行うには2つの方法があります。

古典的で移植性のある( Bash pre-4 )方法は、次のとおりです。

cmd >> outfile 2>&1

で始まる移植不可能な方法Bash 4

cmd &>> outfile

&> outfileに類似)

良いコーディングスタイルのためには、

  • 移植性が問題になるかどうかを判断します(それから古典的な方法を使います)
  • bash pre-4への移植性さえ懸念事項であるかどうかを決定します(それから古典的な方法を使います)
  • どの構文を使用しても、同じスクリプト内で変更しないでください(混乱します)。

スクリプトが既に#!/bin/shで始まっている場合(意図的かどうかにかかわらず)、Bash 4の解決策、そして一般的にはBash特有のコードは、うまくいく方法ではありません。

また、Bash 4の&>>は単なる短い構文であることを覚えておいてください - 新しい機能やそれに類するものは導入されていません。

構文は(他のリダイレクト構文の他に)ここに記述されています: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output

323
TheBonsai

Bashでは、リダイレクトを別のファイルに明示的に指定することもできます。

cmd >log.out 2>log_error.out

追加は次のようになります。

cmd >>log.out 2>>log_error.out
80
Aaron R.

Bash 4(およびZSH 4.3.11)では、

cmd &>>outfile

箱から出して

60
A B

これはうまくいくはずです。

your_command 2>&1 | tee -a file.txt

それはすべてのログを file.txt に保存するだけでなく、それらを端末にダンプします。

42
Pradeep Goswami

これを試して

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 を参照してください。

22
Quintus.Zhou

私が驚いたのは、このアプローチを投稿した人が10年近くも前にいないことです。

&>>が利用できない古いバージョンのbashを使用している場合は、次のこともできます。

(cmd 2>&1) >> file.txt

これはサブシェルを生み出すので、cmd >> file.txt 2>&1の伝統的なアプローチよりも効率的ではありませんが、このアプローチは私にとってより自然で理解しやすい感じです:

  1. Stderrをstdoutにリダイレクトします。
  2. ファイルに追加することによって新しい標準出力をリダイレクトします。

また、特に標準出力と標準エラー出力を別のコマンドに渡す場合は、括弧を使用して順序のあいまいさを取り除きます。

0
jamesdlin