私はファイル記述子間の関係を理解しようとしてきました。私が理解していないものの1つは次のとおりです。
ls -l /bin/usr > ls-output.txt 2>&1
以下とは異なります。
ls -l /bin/usr 2>&1 >ls-output.txt
答え1
リダイレクトは順次実行されるため、リダイレクトの順序が重要です。
>ファイル名2>&1
stdout
この例では、(fd 1
)がターゲットをポイントfilename
し、次にstderr
(fd 2
)がターゲットをポイントします。stdout
filename
つまり、stdout
両方stderr
とも次にリダイレクトされます。filename
2>&1>ファイル名
ここで、stderr
(fd 2
)はターゲットを指し、stdout
(stdout
)fd 1
は次にリダイレクトされます。filename.
これはstderr
、リダイレクトする元の宛先がリダイレクトされてstdout
いることを意味します。stdout
filename
つまり、各ファイル記述子は互いに独立しているため、リダイレクトの順序が重要です。
追加情報
詳しくは、次のような他の質問と回答をご覧ください。
答え2
そうではありません。
a>&b は fd a を fd b にリダイレクトします。 a が指定されない場合は 1 とみなされます。 1 は標準出力、2 は標準エラーです。
一部のシェル(Bashなど)では、&>ファイルを指定して両方をリダイレクトすることもできます。しかし >2>&1 はより移植性に優れています。