378 Stimmen

Testen, ob ein Befehl eine leere Zeichenkette ausgibt

Wie kann ich testen, ob ein Befehl eine leere Zeichenkette ausgibt?

1voto

Darren Smith Punkte 1906

Hier ist ein alternativer Ansatz, der die std-out und std-err eines Befehls in eine temporäre Datei schreibt und dann überprüft, ob diese Datei leer ist. Ein Vorteil dieses Ansatzes ist, dass er beide Ausgaben erfasst und keine Sub-Shells oder Pipes verwendet. Letztere Aspekte sind wichtig, weil sie das Trapping der Bash-Exit-Behandlung stören können (z.B. aquí )

tmpfile=$(mktemp)
some-command  &> "$tmpfile"
if [[ $? != 0 ]]; then
    echo "Command failed"
elif [[ -s "$tmpfile" ]]; then
    echo "Command generated output"
else
    echo "Command has no output"
fi
rm -f "$tmpfile"

0voto

Scott C Wilson Punkte 17730

Manchmal möchte man die Ausgabe speichern, wenn sie nicht leer ist, um sie an einen anderen Befehl weiterzugeben. Wenn dies der Fall ist, können Sie etwas verwenden wie

list=`grep -l "MY_DESIRED_STRING" *.log `
if [ $? -eq 0 ]
then
    /bin/rm $list
fi

Auf diese Weise kann die rm bleibt nicht hängen, wenn die Liste leer ist.

0voto

Tom Hale Punkte 32065

Als von tripleee in den Kommentaren zur Frage erwähnt verwenden moreutils ifne (wenn die Eingabe nicht leer ist).

In diesem Fall wollen wir ifne -n die verneint die Prüfung:

ls -A /tmp/empty | ifne -n command-to-run-if-empty-input

Der Vorteil gegenüber vielen anderen Antworten ist, dass die Ausgabe des Ausgangsbefehls nicht leer ist. ifne beginnt sofort mit dem Schreiben auf STDOUT, anstatt die gesamte Ausgabe zu puffern und später zu schreiben, was wichtig ist, wenn die anfängliche Ausgabe langsam erzeugt wird oder extrem lang ist und die maximale Länge einer Shell-Variablen übersteigen würde.

Es gibt ein paar Utilities in moreutils, die wohl in coreutils sein sollten -- sie sind es wert, dass man sie ausprobiert, wenn man viel Zeit in einer Shell verbringt.

Von besonderem Interesse für den OP könnten sein dirempty/exists das zum Zeitpunkt der Abfassung dieses Berichts immer noch in Erwägung gezogen wird, und zwar schon seit geraumer Zeit (es könnte wahrscheinlich eine Auffrischung vertragen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X