1

これらのコマンドの違いは何ですか:

  1. command 2>&1 > log
  2. command > log 2>&1
  3. command >& log
  4. command > log 1>&2

最初にエラーをコンソールに出力し、ログに出力します。両方がログに記録されないのはなぜですか?

2 つ目は出力を生成しません。出力とエラーはログに記録されます。2>&1最後に置くとどんな違いがありますか?

3枚目は前回と同じ。何のためのショートカットですか?

4 つ目は、すべてをコンソールに出力し、ログには何も出力しませんか?

コマンド例:ls -ld /tmp /xxx

4

2 に答える 2

4

これらは2 つの 記事で非常によく説明されています。基本的に、出力ターゲットのコピーとしてリダイレクトを左から右に読み取る必要があります。そう

command 2>&1 > log
  1. FD 2 (標準エラー) のターゲットを、通常は端末である FD 1 (標準出力) のターゲットに設定します。
  2. FD 1 のターゲットをファイルに設定しますlog

これらは推移的ではないため、コマンドの実行時に標準エラーが実際に端末を指します。


command > log 2>&1
  1. FD 1 のターゲットをファイルに設定しますlog
  2. FD 2 (標準エラー) のターゲットを FD 1 (標準出力) のターゲットに設定します。現在は file ですlog

これは、標準出力と標準エラーの両方が同じファイルに記録されることを意味します。


command >& log

標準エラー出力と標準出力の両方を file にリダイレクトしますlog。これは、前のコマンドの Bash シンタックス シュガーです。


command > log 1>&2
  1. FD 1 のターゲットをファイルに設定しますlog
  2. FD 1 のターゲットを、通常は端末である FD 2 (標準エラー) のターゲットに設定します。これにより、以前のリダイレクトがオーバーライドされます。
于 2013-06-26T11:44:18.763 に答える
2

ではリダイレクトの順序が重要です。

  1. command 2>&1 > logログファイルにリダイレクトstderrしてstdoutからstdoutログファイルにリダイレクトします。したがって、結果はstderr画面に表示され(より高いレベルでリダイレクトされない場合)、stdoutファイルに移動します。
  2. command > log 2>&1stdoutファイルにリダイレクトされ、ファイルでstderrあるファイルハンドルにリダイレクトされ1ます。
  3. command >&logは、前のケースのショートカットです。つまり、ファイルにリダイレクトstderrstdoutます。
  4. これは#2と同じケースです
  5. command > log 1>&2(ファイルハンドル 1) をファイルにリダイレクトstderrし、次にそれを にリダイレクトしstderrます。したがって、結果としてstdoutに移動しstderrます。しかし、ゼロバイト長のlogファイルが表示されます。これは のように書くことができますcommand >log >&2
于 2013-06-26T11:46:37.710 に答える