Linux について読んでいるときに、次のことがわかりました。
stderr は stdout と同じではないため、上記の例ではターミナル ウィンドウにエラー メッセージが表示されます。
stderr を別のファイルにリダイレクトする場合は、stderr のファイル記述子番号 (2)、大なり記号 (>)、実行中のコマンドが stderr に書き込むすべての内容を保持するファイルの名前を使用します。
$ do_something 2> error-file
特別な省略表記法を使用すると、ファイル記述子 2 (stderr) に書き込まれた内容をファイル記述子 1 (stdout) と同じ場所に置くことができます: 2>&1
$ do_something > all-output-file 2>&1
bash では、上記の構文をより簡単に使用できます。
$ do_something >& all-output-file
ここにdo_something
いくつかのコマンドがあります。上記の 3 つのコマンドの背後で何が起こっているのか、まったくわかりません。&
プロセスをバックグラウンド プロセスにするために使用されることは知っていますが、そのロジックがわかりません。私はこのフレーバーを初めて使用します。誰か説明してくれませんか?
答え1
>&
混乱する理由は、 が とは全く異なるものであるためかもしれません&
。
>&
または、<&
リダイレクトでファイル記述子 (fd) を指すために使用されます。上記のケースでは、それぞれ 1 と 2 (stdout と stderr) にリダイレクトされます。
>
「stdout をリダイレクトする」という意味です
2>
「fd 2 (stderr) をリダイレクトする」という意味です。
>&2
は「stdout を fd 2 (stderr) にリダイレクトする」という意味です。これは、>2
「stdout を " という名前のファイルにリダイレクトする」という意味とどのように異なるかに注意してください。2
これが が&
重要である理由です。これは、次に来るものがファイル名ではなく fd であることを示します。
もちろん、ご指摘のとおり、&
リダイレクト記号なしで a が単独で存在する場合、それはまったく異なる意味、つまり「すぐに戻り、前のコマンドをバックグラウンドで実行する」ことを意味します。