Socat

socat 等待答复

  • November 22, 2017

我在腳本中使用它

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"
 }
)

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