Bash
bash:從fifo讀取完整記錄
我希望通過 FIFO 從程序 B 向程序 A 發送命令。
該命令將是一個單詞或一個句子,但完全包含在“\n”終止的行上 - 但通常可以是多行記錄,由另一個字元終止。
我嘗試過的程式碼的相關部分如下所示:
過程一:
$ mkfifo ff $ read x < ff
程序 B:( 從另一個終端視窗)
$ echo -n "cmd" > ff $ echo -n " arg1" > ff $ echo -n " arg2" > ff ... $ echo " argN" > ff
但是,發生的情況是,
read
返回值為cmd
,即使bash
手冊頁說,預設情況下,讀取\n
終止的行,除非-d delim
使用該選項。所以,我接下來嘗試
-d delim
明確指定,$ read -d "\n" x < f`
還是一樣的結果。
可以
echo -n
關閉 FIFO 的文件“描述符”嗎?我在 Ubuntu 18.04 上使用 bash 4.4.x。
是的,這正是發生的事情:
$ mkfifo p $ while :; do cat p ; done > /dev/null & $ strace -etrace=open,close bash -c 'echo -n foo > p; echo bar > p' |& grep '"p"' -A1 open("p", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3 close(3) = 0 -- open("p", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3 close(3) = 0
重定向僅在它們設置的單個命令的持續時間內生效。寫入端的解決方法是 a) 使用複合塊對命令進行分組,或 b)
exec
用於在整個腳本期間(或直到關閉)打開文件描述符。一種)
{ echo -n foo; echo bar; } > p
(您也可以將命令放在函式中,並在呼叫函式時使用重定向。)
b)
exec 3>p echo -n foo >&3 echo bar >&3 exec 3>&- # to explicitly close it
如果你想在閱讀端修復它,你需要循環
read
並連接你得到的字元串。由於您明確需要部分非行,並跳過文件結束條件,因此您不能將退出程式碼read
用於任何有用的事情。