注文リダイレクト

注文リダイレクト

コンピュータがこのコマンドをどのように読んでいるのかわかりません。

cat file1 file2 1> file.txt 2>&1

理解している場合は、2>&1標準エラーを標準出力にリダイレクトしてください。

このロジックに従って、コマンドは次のように動作します。

  1. ファイルfile1file2

  2. stdoutこの操作でに送信しますfile.txt

  3. 発行されましたstderrstdout

  4. 終わり?

コンピュータが何をしているのか分かりません。私のロジックによると、コマンドは次のようになります。

cat file1 file2 2>&1 > file.txt

しかし、これは正しくありません。

答え1

課題を使う方が簡単だと思います。

  • >ように=
  • &ように$

あなたは始まります

1 = /dev/tty
2 = /dev/tty

1> file.txt 2>&1最初の例は

1 = file.txt
2 = $1           # and currently $1 = file.txt

あなたに任せてください

1 = file.txt
2 = file.txt

別の方法でやり直す

1 = /dev/tty
2 = /dev/tty

2>&1 > file.txtそれから

2 = $1           # and currently $1 = /dev/tty
1 = file.txt

だから最終結果は

1 = file.txt
2 = /dev/tty

そして、あなたはリダイレクトだけでstdoutはなくリダイレ​​クトだけをしましたstderr

答え2

リダイレクトの順序が重要なので、読んでください。左から右へ

たとえば、次のことを command 2>&1 >somefile意味します。

  1. 2(にバインドされた)名前のstderr記述子を次にリダイレクトします。現在の1( ) の目的地はstdout左から右に読むと端末である。
  2. 次に1stdout)をsomefileディスク上のファイルインに変更します。

したがって、この場合はstderr端末に移動してstdoutファイルに移動します。これはおそらく欲しいものではありません。

一方、次のことをcommand >somefile 2>&1意味します。

  1. stdoutリダイレクトsomefile
  2. stderrその後、()と同じ宛先にリダイレクトされます。stdoutsomefile

最後の場合にに行くと、stderrおそらくこれが欲しいものでしょう。stdoutsomefile

答え3

cat file1 file2 1> file.txt 2>&1

>&実際にレプリケーションを意味するのは、dupシステムコールを使用して新しいファイル記述子をすでに開いているファイルにマップすることです。

したがって、(実際にbash)最初に新しいstdoutを開いてから、「stderrを現在設定されているstdoutにリダイレクトする」と言う必要があります。

答え4

このコマンドはコマンドの合計を送信しますcat file1 file2 > file.txt 2>&1。これは、file1またはfile2が見つからない場合にのみ機能します。この場合、「ファイルが見つかりません」というエラーメッセージがfile.txtに保存されます。stdoutstderrcatfile.txt

これはと同じですcat file1 file2 &> file.txt

今リダイレクトの順序が重要です。以下は、catコマンドのstderrをfile.txtに送信せずに端末に送信します。

$ cat file1 file2 2>&1 > file.txt 

これは最初にstdoutのターゲットをstderrにコピーしますが、このステップのstdoutはまだターミナルを指しているからです。その後、stdoutをfile.txtにリダイレクトしてstdoutのみをfile.txtに保存します。エラーメッセージはまだ画面に印刷され、file.txtには保存されません。

関連情報