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나머지 시간 동안 백그라운드에서 실행됩니다.

에서는 기다리지 않도록 파이프 끝에 하나를 추가 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"
  }
)

관련 정보