コンピュータがこのコマンドをどのように読んでいるのかわかりません。
cat file1 file2 1> file.txt 2>&1
理解している場合は、2>&1
標準エラーを標準出力にリダイレクトしてください。
このロジックに従って、コマンドは次のように動作します。
ファイル
file1
とfile2
。stdout
この操作でに送信しますfile.txt
。発行されました
stderr
。stdout
終わり?
コンピュータが何をしているのか分かりません。私のロジックによると、コマンドは次のようになります。
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
意味します。
2
(にバインドされた)名前のstderr
記述子を次にリダイレクトします。現在の1
( ) の目的地はstdout
左から右に読むと端末である。- 次に
1
(stdout
)をsomefile
ディスク上のファイルインに変更します。
したがって、この場合はstderr
端末に移動してstdout
ファイルに移動します。これはおそらく欲しいものではありません。
一方、次のことをcommand >somefile 2>&1
意味します。
stdout
リダイレクトsomefile
stderr
その後、()と同じ宛先にリダイレクトされます。stdout
somefile
最後の場合にに行くと、stderr
おそらくこれが欲しいものでしょう。stdout
somefile
答え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に保存されます。stdout
stderr
cat
file.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には保存されません。