Socat
socat 等待答复
我在腳本中使用它
echo $(echo "sign 00:07:32:46:04:75" | socat UDP4-DATAGRAM:239.192.0.2:9000 -)
但這確實會立即停止,並且我沒有得到伺服器的答复
如果我做
echo $(echo "sign 00:07:32:46:04:75" | socat -t5 UDP4-DATAGRAM:239.192.0.2:9000 -)
5 seconds
當響應在 1 秒後可用時,它總是等待。收到第一條消息後,有沒有辦法立即停止命令?
假設答案是一行以換行符分隔的文本,使用
bash
,您總是可以這樣做:IFS= read -r answer < <( echo 'sign 00:07:32:46:04:75' | socat -t 5 - UDP4-DATAGRAM:239.192.0.2:9000)
只要有答案,它就會返回,並
socat
在剩餘時間內在後台執行。在
zsh
中,您需要&
在管道的末尾添加 a 以echo|socat
使其不等待它。您實際上可能還想添加它bash
以防萬一,以防將來bash
決定更改行為。如果答案可以多於一行或不是換行符分隔,
zsh
您可以這樣做:zmodload zsh/system (echo 'sign 00:07:32:46:04:75' | socat -t 5 - UDP4-DATAGRAM:239.192.0.2:9000 &) | sysread answer
sysread
內置函式執行一個read()
大小為 8192 的系統呼叫。假設在一個socat
系統呼叫中將答案寫入管道(它確實如此)。write()
便攜,你總是可以訴諸於此
dd
:answer=$( (echo 'sign 00:07:32:46:04:75' | socat -t 5 - UDP4-DATAGRAM:239.192.0.2:9000 &) | dd bs=8192 count=1 2> /dev/null )
(請注意,命令替換會刪除所有尾隨換行符)。
如果您想避免
socat
在那之後的那幾秒鐘內閒逛,您可以執行以下操作:answer=$( (echo 'sign 00:07:32:46:04:75' | sh -c 'echo "$$" exec socat -t 5 - UDP4-DATAGRAM:239.192.0.2:9000 & ) | { IFS= read pid dd bs=8192 count=1 2> /dev/null kill -s PIPE "$pid" } )