Führe das Programm aus, bis eine bestimmte Anzahl von Bytes auf stdout zurückgegeben wurde, und beende es dann

Führe das Programm aus, bis eine bestimmte Anzahl von Bytes auf stdout zurückgegeben wurde, und beende es dann

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 5das 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 takesollte auch stdin zum ausgeführten Programm umleiten.

Hinweis: head -c 5Dies 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 ddBefehl abgeschlossen wird. Dies kann das sein, was Sie brauchen, muss es aber nicht.

verwandte Informationen