378 Stimmen

Testen, ob ein Befehl eine leere Zeichenkette ausgibt

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

17voto

Wie Jon Lin kommentierte, ls -al wird immer ausgegeben (bei . y .. ). Sie wollen ls -Al um diese beiden Verzeichnisse zu vermeiden.

Sie könnten zum Beispiel die Ausgabe des Befehls in eine Shell-Variable schreiben:

v=$(ls -Al)

Eine ältere, nicht-nestbare Notation ist

v=`ls -Al`

aber ich bevorzuge die verschachtelbare Notation $( ... )

Sie können testen, ob die Variable nicht leer ist

if [ -n "$v" ]; then
    echo there are files
else
    echo no files
fi

Und Sie könnten beides kombinieren als if [ -n "$(ls -Al)" ]; then

Manchmal, ls kann eine Muschel sein alias . Sie könnten es vorziehen, Folgendes zu verwenden $(/bin/ls -Al) . Siehe ls(1) y hier(7) y Umgebung(7) und Ihr ~/.bashrc (wenn Ihre Shell GNU-Bash meine interaktive Shell ist zsh definiert in /etc/passwd - siehe passwd(5) y chsh(1) ).

8voto

Jon Lin Punkte 139414

Ich vermute, Sie wollen die Ausgabe der ls -al Befehl, also in der Bash etwas wie:

LS=`ls -la`

if [ -n "$LS" ]; then
  echo "there are files"
else
  echo "no files found"
fi

4voto

Oleg Kokorin Punkte 1668

Manchmal kann "etwas" nicht zustande kommen stdout sondern an den stderr der Testanwendung, daher hier die Lösung, die auf universellere Weise funktioniert:

if [[ $(partprobe ${1} 2>&1 | wc -c) -ne 0 ]]; then
    echo "require fixing GPT parititioning"
else
    echo "no GPT fix necessary"
fi

3voto

Curt Punkte 440

Hier ist eine Lösung für Extremfälle:

if [ `command | head -c1 | wc -c` -gt 0 ]; then ...; fi

Dies wird funktionieren

  • für alle Bourne-Shells;
  • wenn die Befehlsausgabe nur aus Nullen besteht;
  • effizient und unabhängig von der Größe der Ausgabe;

aber,

  • werden der Befehl oder seine Unterprozesse beendet, sobald etwas ausgegeben wird.

1voto

gniourf_gniourf Punkte 41590

Alle bisher gegebenen Antworten beziehen sich auf Befehle, die beenden. und eine nicht leere Zeichenkette ausgeben.

Die meisten sind in folgendem Sinne gebrochen:

  • Sie gehen nicht richtig mit Befehlen um, die nur Zeilenumbrüche ausgeben;
  • Ab Bash4.4 spammen die meisten Standardfehler, wenn der Befehl Null-Bytes ausgibt (da sie Befehlssubstitution verwenden);
  • Die meisten schlürfen den gesamten Ausgabestrom, warten also, bis der Befehl beendet ist, bevor sie antworten. Einige Befehle werden nie beendet (versuchen Sie z.B., yes ).

Um all diese Probleme zu lösen und um die folgende Frage effizient zu beantworten,

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

können Sie verwenden:

if read -n1 -d '' < <(command_here); then
    echo "Command outputs something"
else
    echo "Command doesn't output anything"
fi

Sie können auch eine Zeitüberschreitung hinzufügen, um zu testen, ob ein Befehl innerhalb einer bestimmten Zeit eine nicht leere Zeichenkette ausgibt, indem Sie read 's -t Option. Z.B. für eine Zeitüberschreitung von 2,5 Sekunden:

if read -t2.5 -n1 -d '' < <(command_here); then
    echo "Command outputs something"
else
    echo "Command doesn't output anything"
fi

Bemerkung. Wenn Sie glauben, dass Sie feststellen müssen, ob ein Befehl eine nicht leere Zeichenkette ausgibt, haben Sie sehr wahrscheinlich ein XY-Problem.

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