Exec
使用 exec 3> 保持命名管道打開
當寫入管道的程序完成寫入(發送 EOF)時,從命名管道讀取的程序通常會終止。在某些情況下,您可能有不同的程序間歇性地寫入管道,並希望單個程序連續從管道中讀取。為此,您可以設置一個“虛擬”編寫器來打開管道但不寫入:
$ mkfifo myPipe $ cat > myPipe &
虛擬編寫器保持命名管道打開 - 無需向其中輸入數據或關閉。因此,讀取器程序能夠接收來自所有(其他)合法寫入器的輸入,而無需終止並且必須重新啟動。
我見過一些人使用
exec 3>
而不是cat
作為保持命名管道打開的一種方式。$ mkfifo myPipe $ cat < myPipe & [1] 10796 $ exec 3> myPipe $ echo "blah" > myPipe blah
這種方法似乎有效,而且您無需擔心(或清理)後台的虛擬作家,因此我喜歡它。問題是我真的不明白。
如何
exec 3>
在沒有要執行的實際文件或可見(後台)程序的情況下完成保持命名管道打開的任務,這種方法有什麼缺點嗎?(我知道它最終必須打開命名管道的輸入文件描述符以進行寫入,所以我對這
exec 3
部分exec 3>
正在做什麼特別感興趣。)
你解析錯了;它是
exec
而3>fifo
不是exec 3
和>fifo
。exec
沒有命令將任何重定向應用到主 shell,並且>
重定向可以採用文件描述符參數(如 in3>
)而不是隱式1
(stdout)。至於它的缺點,打開的文件描述符將被傳遞給子程序/子shell,除非在每個
exec 3>&-
子程序中顯式關閉(使用) ,否則將導致管道另一端的任何讀取器在所有這些子程序之前都不會獲得 EOF已經退出。保持管道打開的另一個技巧是在讀寫模式下打開它,這也將導致它在打開時不會阻塞:
mkfifo /tmp/fifo (exec 1<>/tmp/fifo; echo tee; sed 's/e/o/g; 1q' <&1 >&2) too