エラーリダイレクトの背後では何が起こっているのでしょうか?

エラーリダイレクトの背後では何が起こっているのでしょうか?

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 が単独で存在する場合、それはまったく異なる意味、つまり「すぐに戻り、前のコマンドをバックグラウンドで実行する」ことを意味します。

関連情報