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