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
bash
wertet 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 woeval
kommt 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 eval
vor 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.