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