
Ich möchte das Gegenteil tun xargs --no-run-if-empty
, sodass es NUR ausgeführt wird, wenn die Standardeingabe leer ist.
Anwendungsbeispiel:
ip a | fgrep "inet " | grep -ve " tun" -e " lo"
# pipe it into something and echo localhost if empty
Antwort1
In diesem Fall grep
gibt es einen Fehlercode zurück, wenn es nichts findet (keine Ausgabe hat). Daher müssen wir uns nicht die Standardausgabe ansehen. Wir können uns stattdessen den Fehlercode ansehen. ||
wird dies tun und den folgenden Befehl nur ausführen, wenn der vorherige Befehl fehlschlägt.
ip a | fgrep "inet " | grep -ve " tun" -e " lo" || echo localhost
Antwort2
Das Paket moreutils
stellt ifne
ein Tool bereit. Normalerweise ifne
wird der angegebene Befehl genau dann ausgeführt, wenn die Standardeingabenichtleer. Es hat jedoch eineRückwärtsbetriebModus:
-n
Umgekehrter Vorgang. Führen Sie den Befehl aus, wenn die Standardeingabe leer ist.
ifne
Beachten Sie, dass die Standardeingabe in diesem Fall durchgelassen wird, wenn sie nicht leer ist .
Verwenden Sie es wie folgt:
ip a | fgrep "inet " | grep -ve " tun" -e " lo" | ifne -n echo "localhost"
Dies ist der Unterschied zu anderen Antworten:
- die Lösung ist nicht vom Beendigungsstatus eines Befehls abhängig;
ifne
verbraucht den Stream nicht, wenn er nicht leer ist (es ist unklar, ob das ist, was Sie wollen).
Eine Alternative für Text ist awk '{print} END {if (NR==0) print "localhost"}'
. Bei Daten, die kein Text sind (im Sinne von POSIX: NUL-Zeichen, {LINE_MAX} überschritten, unvollständige Zeile), awk
funktioniert es möglicherweise nicht wie gewünscht.
Antwort3
Haben Sie eine einfache Bedingung wie diese ausprobiert?
[[ -z $(ip a | fgrep "inet " | grep -ve " tun" -e " lo") ]] && echo localhost