Ich verwende dies in einem Skript
echo $(echo "sign 00:07:32:46:04:75" | socat UDP4-DATAGRAM:239.192.0.2:9000 -)
aber das stoppt sofort und ich bekomme keine Antwort vom Server
wenn ich mache
echo $(echo "sign 00:07:32:46:04:75" | socat -t5 UDP4-DATAGRAM:239.192.0.2:9000 -)
es wird immer 5 seconds
auch dann gewartet, wenn die Antwort erst nach 1 Sekunde vorliegen würde.
Gibt es eine Möglichkeit, den Befehl sofort zu stoppen, nachdem ich die erste Nachricht erhalten habe?
Antwort1
Angenommen, die Antwort ist eine durch eine neue Zeile getrennte Textzeile. Mit bash
könnten Sie immer Folgendes tun:
IFS= read -r answer < <(
echo 'sign 00:07:32:46:04:75' |
socat -t 5 - UDP4-DATAGRAM:239.192.0.2:9000)
Dies würde zurückkehren, sobald eine Antwort vorliegt, und socat
für die verbleibende Zeit im Hintergrund laufen.
In zsh
müssten Sie &
am Ende der echo|socat
Pipeline ein hinzufügen, damit nicht darauf gewartet wird. Möglicherweise möchten Sie es bash
auch für hinzufügen, um zukunftssicher zu sein, falls bash
Sie sich entscheiden, das Verhalten in Zukunft zu ändern.
Wenn die Antwort mehr als eine Zeile umfassen kann oder nicht durch eine neue Zeile getrennt ist, zsh
können Sie Folgendes tun:
zmodload zsh/system
(echo 'sign 00:07:32:46:04:75' |
socat -t 5 - UDP4-DATAGRAM:239.192.0.2:9000 &) | sysread answer
Das sysread
eingebauteeins read()
Systemaufruf der Größe 8192. Das setzt voraus, dass socat
die Antwort in die Pipe geschrieben wird ineins write()
Systemaufruf (was er tut).
Portabel können Sie dd
hierfür immer auf Folgendes zurückgreifen:
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
)
(Beachten Sie, dass durch die Befehlsersetzung alle nachstehenden Zeilenumbruchzeichen entfernt werden.)
socat
Wenn Sie diese paar zusätzlichen Sekunden danach nicht mehr warten möchten , können Sie Folgendes tun:
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"
}
)