Wie kann ich alle Ausgaben eines Befehls mit Bash unterdrücken?

296

Ich habe ein Bash-Skript, das ein Programm mit Parametern ausführt. Dieses Programm gibt einen Status aus (dies tun, das tun ...). Es gibt keine Möglichkeit für dieses Programm, leise zu sein. Wie kann ich verhindern, dass das Skript etwas anzeigt?

Ich suche nach etwas wie Windows ' "Echo aus" .

6 Bytes
quelle

Antworten:

510

Im Folgenden wird die Standardausgabe an das Nullgerät (Bit-Bucket) gesendet.

scriptname >/dev/null

Und wenn Sie auch möchten, dass Fehlermeldungen dorthin gesendet werden, verwenden Sie eine der folgenden Optionen (die erste funktioniert möglicherweise nicht in allen Shells):

scriptname &>/dev/null
scriptname >/dev/null 2>&1
scriptname >/dev/null 2>/dev/null

Wenn Sie die Nachrichten aufzeichnen, aber nicht sehen möchten, ersetzen Sie sie /dev/nulldurch eine tatsächliche Datei, z.

scriptname &>scriptname.out

Der Vollständigkeit halber lautet es unter Windows cmd.exe (wobei "nul" das Äquivalent von "/ dev / null" ist):

scriptname >nul 2>nul
andynormancx
quelle
8
Beachten Sie, dass '&>' Bash (und möglicherweise C-Shells) eigen ist. Korn- und Bourne-Shells benötigen 2> / dev / null oder 2> & 1 (um stderr an den gleichen Ort wie stdout zu senden). Die Korn-Shell scheint '&>' als "Führen Sie das Material bis zu & im Hintergrund aus und führen Sie dann die E / A-Umleitung für einen leeren Befehl aus" zu interpretieren.
Jonathan Leffler
2
Beachten Sie, dass einige Befehle direkt auf das Endgerät und nicht auf die Standardausgabe / den Standardfehler schreiben. Zum Testen echo foo > $(tty)ein Skript einfügen und ausführen ./test.sh &> /dev/null- Die Ausgabe wird weiterhin auf dem Terminal gedruckt. Dies ist natürlich kein Problem, wenn Sie ein Skript schreiben, das keine solchen Befehle verwendet.
10.
1
@ l0b0, gibt es eine Möglichkeit, die Tty des Skripts (oder eines anderen Programms) so zu ändern, dass alle Ausgaben unabhängig von Ihrem Beispiel umgeleitet werden? Ich weiß, dass Bildschirm und Skript so etwas können, aber beide sind pingelig und variieren von * nix bis * nix.
Brent
@yang /dev/nullexistiert in Cygwin, Sie müssen es nicht verwenden nul.
dimo414
47

Etwas wie

script > /dev/null 2>&1

Dies verhindert die Standardausgabe und die Fehlerausgabe und leitet beide an um /dev/null.

Diego Sevilla
quelle
5
Wird auch mit nur &> erreicht, wenn Sie etwas
tippen
1
Obwohl ich dies meinem Befehl gs (GhostScript) hinzufüge, wird es immer noch ausgegeben. **** Warnung: Datei hat einen beschädigten %% EOF-Marker oder Müll nach %% EOF. Irgendein Rat?
ZurabWeb
Dies führt den Prozess nicht auf Unix-Systemen aus, ich musste es tun2>/dev/null
am
13

Versuchen

: $(yourcommand)

: ist die Abkürzung für "nichts tun".

$() ist nur dein Befehl.

V0idSt4r
quelle
3
Sehr interessant, aber es gibt eine Einschränkung: Der zurückgegebene Statuscode ist immer 0(Erfolg). Sehen wir uns ein Beispiel mit einem Befehl an false, der immer zurückgibt 1(Fehler). Zum Beispiel ( echo foo | tee file ; false ) && echo barAnzeigen foo. Verwenden Sie Ihren Trick, um die Ausgabe zu unterdrücken : ( : $(echo foo | tee file ; false) ) && echo bar. Es wird jedoch angezeigt, barwas bedeutet, dass der Rückgabestatuscode lautet 0(dies ist nicht der zurückgegebene Statuscode von false). Bitte aktualisieren Sie Ihre Antwort unter Berücksichtigung dieser Einschränkung. Prost
olibre
2
@olibre, was ist mit DUMMY=$(yourcommand)? Es gibt nicht die von Ihnen erwähnte Einschränkung. :)
Semente
3
@semente Perfekt: Der Befehl DUMMY=$( echo foo | tee file ; false ) && echo barzeigt nichts an. Und der Befehl wird DUMMY=$( echo foo | tee file ; true ) && echo barangezeigt bar. Lassen Sie mich wissen, wenn Sie eine Antwort geben, um es zu verbessern ;-) Prost
olibre
9

Eine Alternative, die in einigen Situationen passen kann, besteht darin, das Ergebnis eines Befehls einer Variablen zuzuweisen:

$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1

Da Bash und andere POSIX-Befehlszeileninterpreter Variablenzuweisungen nicht als Befehl betrachten, wird der Rückkehrcode des vorliegenden Befehls eingehalten.

Hinweis: Die Zuweisung mit dem Schlüsselwort typesetoder declarewird als Befehl betrachtet. Der ausgewertete Rückkehrcode für den Fall ist also die Zuweisung selbst und nicht der in der Subshell ausgeführte Befehl:

$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0
semente
quelle
6

Verwenden Sie dies wie den Beitrag von andynormancx (wenn Sie in einer Unix-Umgebung arbeiten):

scriptname > /dev/null

Oder Sie können dies verwenden (wenn Sie in einer Windows-Umgebung arbeiten):

scriptname > nul
Lucas Gabriel Sánchez
quelle
1
In der Windows-Shell können Sie es tatsächlich besser machen. Wenn Sie stattdessen "scriptname> nul" verwenden, müssen Sie nicht einmal eine Datei löschen, da "nul" das Windows-Äquivalent von / dev / null ist.
andynormancx
1
@andynormancx: Das hasse ich am Windows-Dateisystemlayout. Es "reserviert" Dateinamen wie NUL, COM1, LPT1, CON usw., unabhängig davon, in welchem ​​Verzeichnis Sie sich befinden (selbst wenn Sie sich in einem Dateisystem befinden, das diese Dateinamen haben kann, wie in Netzwerkfreigaben).
Dreamlax
Ich glaube nicht, dass ich NUL seit DOS 5.x tatsächlich verwendet habe, hatte einen plötzlichen Erinnerungsblitz, als ich diese Antwort sah;)
andynormancx
Falls Sie unter > nulWindows mit Cygwin oder Git Bash gearbeitet haben und jetzt mit einer nulDatei feststecken , die nicht gelöscht werden kann, versuchen Sie es bitte mit dieser Antwort . Sie hat wie ein Zauber funktioniert.
Daemon Painter
4

Schauen Sie sich dieses Beispiel aus dem Linux-Dokumentationsprojekt an :

3.6 Beispiel: Datei stderr und stdout 2

Dadurch wird jede Ausgabe eines Programms in eine Datei eingefügt. Dies ist manchmal für Cron-Einträge geeignet, wenn ein Befehl in absoluter Stille übergeben werden soll.

     rm -f $(find / -name core) &> /dev/null 

Sie können jedoch diese einfache Umleitung verwenden:

/path/to/command &>/dev/null
ivanleoncz
quelle
1

In Ihrem Skript können Sie den Zeilen, von denen Sie wissen, dass sie eine Ausgabe liefern, Folgendes hinzufügen:

some_code 2>>/dev/null

Oder Sie können es auch versuchen

some_code >>/dev/null
Rohan Dsouza
quelle
1
Ich habe >> to / dev / null nie gesehen .. aus Neugier .. Warum machst du das?
Florian Berndl
Unterdrückt es alle Ausgaben?
Peter Mortensen
Warum das doppelte ">" ( >>)?
Peter Mortensen