Supondo que a resposta seja uma linha de texto delimitada por nova linha, com bash
, você sempre pode fazer:
IFS= read -r answer < <(
echo 'sign 00:07:32:46:04:75' |
socat -t 5 - UDP4-DATAGRAM:239.192.0.2:9000)
Isso retornaria assim que houvesse uma resposta e socat
ficaria em segundo plano pelo tempo restante.
Em zsh
, você precisaria adicionar &
no final do echo|socat
pipeline para não esperá-lo. Você pode querer adicioná-lo para bash
e também para o futuro caso bash
decida alterar o comportamento no futuro.
Se a resposta puder ser mais de uma linha ou não for delimitada por nova linha, com zsh
você poderia fazer:
zmodload zsh/system
(echo 'sign 00:07:32:46:04:75' |
socat -t 5 - UDP4-DATAGRAM:239.192.0.2:9000 &) | sysread answer
A sysread
builtin faz uma read()
chamada de sistema do tamanho 8192. Isso assume socat
grava a resposta no canal em um write()
system chamada (o que faz).
Portável, você sempre pode recorrer a dd
para isso:
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
)
(note que a substituição de comandos retira todos os caracteres de nova linha).
Se você quisesse evitar socat
esperando por alguns segundos extras depois disso, você poderia fazer algo como:
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"
}
)