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秒待ちます。

最初のメッセージを受信するとすぐにコマンドを停止する方法はありますか?

答え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|socatbashbash

答えが複数行になっている場合、または改行で区切られていない場合は、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"
  }
)

関連情報