私のスクリプトでこれを使用します。
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秒待ちます。
最初のメッセージを受信するとすぐにコマンドを停止する方法はありますか?
答え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
バックグラウンドで実行されます。
では、待たないようにパイプの端に1つを追加するzsh
必要があります。将来の行動を変えることにした場合は、実際に将来に備えてこれを追加したいかもしれません。&
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"
}
)