リダイレクトに重複したファイル記述子があります。

リダイレクトに重複したファイル記述子があります。

~から GNU Bashリファレンスマニュアル、セクション3.6リダイレクト:

Bashは、次の表に示すように、リダイレクトで複数のファイル名を使用するときに特に複数のファイル名を処理します。

/dev/fd/fd

    もしFD有効な整数、ファイル記述子です。FD繰り返されます。

/dev/stdin

    ファイル記述子0が重複しています。

/dev/stdout

    ファイル記述子1が重複しています。

/dev/stderr

    ファイル記述子2が重複しています。

ここで「繰り返し」とはどういう意味ですか?いくつかの例を挙げることができますか?

(上記の内容は から抜粋した内容です。バージョン 4.3、最終更新日:2014年2月2日、GNU Bashリファレンスマニュアル、バージョン4.3の場合Bash。 )

答え1

リダイレクトは以下によって達成されます。繰り返すシステム機能シリーズ。dupは略語ですコピーたとえば、これを行うと次のようになります。

3>&2

()ファイルディスクリプタ2をファイルディスクリプタ3にコピーしdup2、ファイルディスクリプタ3(dup2(2,3))がすでに開いている場合は閉じることができます。これはfork子プロセスを終了したときに発生するため、親プロセスには何もしません。 (シェルからのリダイレクト)はいくつかの状況で動作し、シェルではそれが動作するように見えます)。

これを行うとき:

1<someFile

これはopen someFile、新しいファイルディスクリプタ(open通常はシステムコールが実行するアクション)の次の対応するdup2ファイルディスクリプタを1(dup2(newfd,1))に配置します。

コピーされたターゲットファイル記述子は常に左側に「&」がなく(リダイレクトを割り当てと見なすのに役立つ可能性があり、//の混乱したleft=right方向で混乱しない可能性があります)、右側に開いているファイルがあります。名前は(、または開く方法を決定します - 書き込みおよび生成可能、追加および生成可能、または読み取り専用の場合は切り捨てられます)、または右側のアンパサンドの後にソースファイルの説明記号が続きます(影響を受けません)または)。左を省略すると、for または for が暗示されます。<>>>>>><>>><1>>>0<

マニュアルによると、リストされている特別な開発ファイルの1つが置き換えられると、someFileシェルはopen-on-a-new-fdステップをスキップし、代わりに一致するdup2ファイル記述子に直接移動します(たとえば、1は/ dev / stdoutを意味します)。など)を対象に(左のファイル記述子をリダイレクト)

  • リダイレクトソース(RHS)/ dev / stdin <=>&0
  • リダイレクトソース(RHS)/dev/stdout <=>&1
  • リダイレクトソース(RHS)/dev/stderr <=>&2
  • リダイレクトソース (RHS) /dev/fd/$somefd <=> &$somefd

答え2

ファイル記述子は、カーネルのグローバルファイルテーブルへのポインタです(参照:https://www.computerhope.com/jargon/f/file-descriptor.htm例えば)。したがって、数値(ラベルまたは名前として機能します)と値(実際のポインタ)があります。ファイルディスクリプタを別のファイルディスクリプタにコピーすると、実際にはソースファイルディスクリプタからターゲットファイルディスクリプタにポインタ値をコピーします。コピーソースをターゲットに変換します。

したがって、次のように宣言してください。

>リダイレクトに複数のファイル名が使用されている場合、Bashは次の表に示すようにこれらのファイル名を排他的に処理します。 [...]

/開発/強い

  File descriptor 1 is duplicated

する時の意味"n>/dev/stdout"(/dev/stdout にリダイレクトするか、/dev/stdout fd を n fd にコピー)、bash は単に fd "1" をコピーします。特殊ファイルではなく通常のファイルにリダイレクトする場合、bash は新しいファイル記述子を生成し、リダイレクトするファイル記述子にコピーします。

関連情報