同じユーザーの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()
(パイプがインスタンス化され、シェルは、それからの入力を読み取り、その時点で)パイプに書き込みモードで別のオープンを行って、いくつかのプロセスがあるまで戻りません。