Wie kann ich testen, ob ein Befehl eine leere Zeichenkette ausgibt?
Antworten
Zu viele Anzeigen?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) ).
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.
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.