Führen Sie einen Befehl aus, wenn die Standardeingabe leer ist

Führen Sie einen Befehl aus, wenn die Standardeingabe leer ist

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 grepgibt 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 moreutilsstellt ifneein Tool bereit. Normalerweise ifnewird 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.

ifneBeachten 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;
  • ifneverbraucht 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), awkfunktioniert 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

verwandte Informationen