So unterdrücken Sie die Ausgabe von „tee“ basierend auf der Variable in Bash

So unterdrücken Sie die Ausgabe von „tee“ basierend auf der Variable in Bash

Im folgenden Beispiel gilt:

echo "text to write to file but also not send to stdout" | tee -a $logfile 1> /dev/null

Die Ausgabe wird nicht auf dem Terminal gedruckt. Aber wenn ich versuche, dieselbe Aktion basierend auf einer Variablen auszuführen, funktioniert es nicht.

Ex:

$loud=""
if [ -z $loud ]; then
  route_devnull="1> /dev/null"
else
  route_devnull=""
fi
echo "text to write to file but also not send to stdout" | tee -a $logfile $route_devnull

Wie kann ich das zweite Beispiel zum Laufen bringen? Oder sollte ich versuchen, die Meldungen auf eine andere Weise zu unterdrücken?

Antwort1

Kurz zusammengefasst:echo "text to write to file but also not send to stdout" | eval tee -a $logfile $route_devnull

bashwertet Variablen nicht als Befehle aus. Sie können schreiben

echo "abc && touch new"

und es wird auf dem Terminal gedruckt abc && touch new. Dies ist beabsichtigt, da Zeichenfolgen von Benutzern eingegeben werden können und wir ihren Befehlen nicht vertrauen möchten, da sie bösartige Dinge tun könnten, wie zum Beispiel versuchen, unseren Computer zu beschädigen.

Das ist woevalkommt herein.

Anstatt den Befehl zuerst auszuführen, liest eval undwertet ausalle Argumente, um einen weiteren Befehl zu konstruieren und diesen dann auszuführen. Beispiel:

eval echo "abc && touch new"

Schieben Sie einfach evalvor das, was Sie vor der Ausführung auswerten möchten. Und mit „einfach schieben“ meine ich „denken Sie sehr gut darüber nach, ob Sie eval„“ verwenden.

verwandte Informationen