web-dev-qa-db-ja.com

リダイレクトでのファイル記述子の複製

差出人 https://www.gnu.org/software/bash/manual/html_node/Redirections.html

次の表に示すように、Bashは、リダイレクトで使用される場合に特にいくつかのファイル名を処理します。

/ dev/fd/fd fdが有効な整数の場合、ファイル記述子fdが複製されます。

/ dev/stdinファイル記述子0が複製されています。

/ dev/stdoutファイル記述子1が複製されています。

/ dev/stderrファイル記述子2が複製されています。

ここで「複製」とはどういう意味ですか?いくつか例を挙げていただけますか?

3
Tim

リダイレクトは、 dup システム関数ファミリーを介して実装されます。 dupduplicationの略で、次のようになります。

3>&2

複製します(dup2)filedescritor2をfiledescriptor3に追加し、filedescriptor 3が既に開いている場合は閉じる可能性があります(これはforked offの子で発生するため、親プロセスには影響しません(そうでない場合(リダイレクト)特定のコンテキストでのシェル関数では、シェルはそれをあたかもそうであるかのように見せます))。

あなたがするとき:

1<someFile

新しいファイル記述子でopensomeFile(これは、open syscallが通常行うことです)、その後dup2そのファイル記述子を1に。

マニュアルによると、リストされている特別な開発ファイルの1つがsomeFileの代わりになると、シェルはopen-on-a-new-fdステップをスキップし、代わりに直接dup2一致するファイル記述子(つまり、/ dev/stdoutの場合は1など)をターゲット(リダイレクトの左側にあるファイル記述子)に移動します。

10
PSkocik