
Auf einem Freebsd-System führe ich mein Bash-Skript aus und versuche, die Ausgabe umzuleiten:
% sudo bash some_file.sh arg1 >/dev/null 2>&1
Ambiguous output redirect.
% sudo bash some_file.sh arg1 &> /dev/null
Invalid null command.
Antwort1
Sieht so aus, als ob Sie csh in Ihrer Befehlszeile verwenden (überprüfen Sie dies mit echo $SHELL
).
- Verwenden Sie entweder die CSH-Syntax zum Umleiten von stdout und stderr:
sudo bash some_file.sh arg1 >& /dev/null
- Oder verschieben Sie die Umleitung in den "Bash-Teil" des Befehls mit
sudo bash -c 'some_file.sh arg1 >/dev/null 2>&1'
Antwort2
Sie sind nah dran gekommen, aber keine davon ist die richtige Syntax für die TENEX C-Shell.
Denken Sie daran: Die interaktive Login-Shell, die Sie unter FreeBSD verwenden, ist, sofern Sie sie nicht geändert haben, die TENEX C-Shell. Ihre Umleitung des sudo
Befehls muss die Umleitungssyntax der TENEX C-Shell verwenden. Es spielt keine Rolle, dass Sie die Bourne Again-Shell über ausführen sudo
. Das wird nur bestimmtnachdem die Umleitung stattgefunden hat und sudo
bereits ausgeführt wurde.
Das:
% sudo bash eine_datei.sh arg1 >/dev/null 2>&1ist praktisch dasselbe wie
% >/dev/null >&1 sudo bash eine_datei.sh arg1 2das versucht, die Standardausgabe zweimal an zwei verschiedene Orte umzuleiten.
Das:
% sudo bash eine_datei.sh arg1 &> /dev/nullist eigentlich
% sudo bash eine_datei.sh arg1 & > /dev/nullund wird als solches in Ihren Befehlsverlauf umgeschrieben. Es sind zwei Befehle, die durch verbunden sind
&
, sudo
und ein Befehl ohne Namen oder Argumente. Letzteres ist in der TENEX C-Shell nicht zulässig.
So leiten Sie sowohl die Standardausgabe als auch die Standardfehlerausgabe /dev/null
in der TENEX C-Shell um:
% sudo bash eine_datei.sh arg1 >& /dev/null