同じユーザーの2つのウィンドウで、bashプロンプトが表示されます。ウィンドウ1で次のように入力します。
$ mkfifo f; exec <f
そのため、bashは名前付きパイプにマップされているファイル記述子0から読み取ろうとしていますf。ウィンドウ2で次のように入力します。
$ echo ls > f
ここでwindow-1はlsを出力してから、シェルが終了します。どうして?
次の実験:でもう一度window-1を開きますexec <f。ウィンドウ2で次のように入力します。
$ exec 3>f
$ echo ls >&3
上記の最初の行の後で、window-1が起動し、プロンプトを出力します。どうして?上述の第2行の後に、ウィンドウ1のプリントls出力とシェル滞在アライブ。どうして?実際、現在window-2でecho ls > f、window-1シェルを閉じません。
答えは、名前付きパイプを参照するwindow-2からのファイル記述子3の存在と関係がある必要がありますか?
exec 3>f実行すると、最初のシェルがプロンプトを表示する理由です。(マイナーポイント、コメントで「書き込みモード」という意味でしたか?)
exec <f、bashからの読み取りを試みていない後、f最初に開こうとしています。open()(パイプがインスタンス化され、シェルは、それからの入力を読み取り、その時点で)パイプに書き込みモードで別のオープンを行って、いくつかのプロセスがあるまで戻りません。