Bash

bash:從fifo讀取完整記錄

  • June 11, 2018

我希望通過 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用於任何有用的事情。

引用自:https://unix.stackexchange.com/questions/449111