Stellen Sie sich vor, ich habe das folgende Programm/Skript ./generate-infinite-byte-stream
:
#!/bin/bash
echo -n 'hello'
sleep infinity
Der Befehl „Infinite Sleep“ stellt eine Netzwerkverbindung dar, die in unbestimmter Zukunft möglicherweise mehr Daten liefert, an denen ich nicht interessiert bin, oder auch nicht.
Ich hätte gerne ein Programm, nennen wir es so, take 5
das so lange läuft ./generate-infinite-byte-stream
, bis es 5 Bytes auf stdout ausgegeben hat und es dann beendet:
take 5 ./generate-infinite-byte-stream
# gives 'hello' and returns with exit code 0
Gibt es ein solches Programm oder muss ich mein eigenes mit popen() erstellen? Das Programm take
sollte auch stdin zum ausgeführten Programm umleiten.
Hinweis: head -c 5
Dies ist nicht der richtige Vorgang, da es nicht beendet wird:
./generate-infinite-byte-stream | head -c 5
# this returns 'hello', but never terminates
Nebenbei: Der Name Take ist inspiriert von derhttps://reference.wolfram.com/language/ref/Take.htmlBefehl, der die ersten n Elemente einer Liste zurückgibt.
Antwort1
Wenn Ihre Shell Bash ist, können Sie eine Prozesssubstitution verwenden. Demo:
dd bs=1 count=5 < <(printf hello; sleep infinity)
Dadurch wird der Produzent nicht getötet, aber die Verbindung wird getrennt, sodass der dd
Befehl abgeschlossen wird. Dies kann das sein, was Sie brauchen, muss es aber nicht.