echo stdin, sofern nicht leer, in diesem Fall eine Datei

402
Camille Goudeseune

Die Pipeline fstdraw in.fst | dot -Tpng | convert - -rotate 90 out.pngkonvertiert eine Datei in einem bestimmten Binärformat in ein PNG-Bild.

Leider werden in einigen Fällen fstdrawnull Bytes ausgegeben. (Ein Fehler in seinem Paket, OpenFst .) Dann werden dotauch null Bytes anstelle einer PNG- Datei ausgegeben, woraufhin convertdie Erstellung fehlschlägt out.png. Diese fehlende Datei unterbricht spätere Befehle.

Wie kann man am ersten Pipe-Symbol etwas einfügen, das heißt, meine Eingabe wiederholen, aber wenn meine Eingabe leer ist, stattdessen die Datei dummy.txt ausgeben, also out.pngimmer erstellt wird?

(Man könnte ein Skript schreiben, aber sicherlich wird dies bereits von einem eingebauten oder Standard-Tool der Shell ausgeführt .)

So etwas wie fstdraw in.fst | cat_maybe dummy.txt | dot ...

1

1 Antwort auf die Frage

1
Kamil Maciorowski

Explizite Antwort

Das Paket moreutilsenthält ein ifneWerkzeug. Normalerweise wird der angegebene Befehl nur dann ausgeführt, wenn die Standardeingabe nicht leer ist. Es hat jedoch einen umgekehrten Betriebsmodus :

-n 

Umkehrbetrieb. Führen Sie den Befehl aus, wenn die Standardeingabe leer ist.

Wenn die Standardeingabe nicht leer ist, wird sie ifnein diesem Fall durchgereicht .

Die Lösung lautet also:

fstdraw in.fst | ifne -n cat dummy.txt | dot -Tpng | convert - -rotate 90 out.png 

Alternativer Ansatz

Dies wurde ursprünglich als Kommentar gepostet. Es geht darum, zu erkennen, wann ein convertFehler auftritt, und entsprechend zu handeln. Die Methode beantwortet die explizite Frage nicht, kann jedoch Ihr spezifisches Problem lösen. Ich poste es hier zu Bildungszwecken.

fstdraw in.fst | dot -Tpng | convert - -rotate 90 out.png || cp dummy.png out.png