내 스크립트에서 이것을 사용합니다.
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|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"
}
)