命名管道、文件描述符和 EOF
兩個視窗,同一使用者,帶有 bash 提示。在 window-1 類型中:
$ mkfifo f; exec <f
所以 bash 現在正試圖從映射到命名管道的文件描述符 0 中讀取
f
。在 window-2 類型中:$ echo ls > f
現在 window-1 列印一個 ls 然後 shell 死掉了。為什麼?
下一個實驗:用 再次打開 window-1
exec <f
。在 window-2 類型中:$ exec 3>f $ echo ls >&3
在上面的第一行之後,window-1 被喚醒並列印一個提示。為什麼?在上面的第二行之後,window-1 列印
ls
輸出並且 shell 保持活動狀態。為什麼?實際上,現在在window-2 中,echo ls > f
並沒有關閉window-1 外殼。答案一定與window-2中引用命名管道的文件描述符3的存在有關?!
它與文件描述符的關閉有關。
在您的第一個範例中,
echo
寫入其標準輸出流,shell 打開該流以將其與 連接f
,當它終止時,其描述符被關閉(由 shell)。在接收端,從其標準輸入流(連接到f
)讀取輸入的 shell 讀取ls
、執行ls
,然後由於其標準輸入上的文件結束條件而終止。文件結束條件的發生是因為命名管道的所有寫入者(本例中只有一個)都關閉了管道的末端。
在您的第二個範例中,
exec 3>f
打開文件描述符 3 以寫入f
,然後echo
寫入ls
它。現在打開文件描述符的是shell,而不是echo
命令。描述符保持打開狀態,直到您這樣做exec 3>&-
。在接收端,從其標準輸入流(連接到f
)讀取輸入的 shellls
執行ls
,然後等待更多輸入(因為流仍然打開)。流保持打開狀態,因為它的所有寫入者(shell、via
exec 3>f
和echo
)都沒有關閉它們的管道末端(exec 3>f
仍然有效)。我在上面寫過
echo
,好像它是一個外部命令。它很可能是內置在外殼中的。效果還是一樣的。