Wie kann ich die Ausgabe in einem Bash-Skript stumm schalten?

149

Ich habe ein Programm, das auf stdout ausgibt, und möchte diese Ausgabe in einem Bash-Skript stumm schalten, während ich zu einer Datei weiterleite.

Wenn Sie beispielsweise das Programm ausführen, wird Folgendes ausgegeben:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

Ich möchte, dass das folgende Skript nichts an das Terminal ausgibt:

#!/bin/bash
myprogram > sample.s
Sam
quelle
Soweit ich mich erinnere, führt die Umleitung der Ausgabe in eine Datei dazu, dass sie nicht an das Terminal zurückgegeben wird. Was funktioniert bei dir nicht?
Anon.
serverfault.com/questions/41964/…
Ciro Santilli 法轮功 冠状 冠状. 六四 事件 29.

Antworten:

187

Wenn es auch an stderr ausgegeben wird, möchten Sie dies zum Schweigen bringen. Sie können dies tun, indem Sie den Dateideskriptor 2 umleiten:

# Send stdout to out.log, stderr to err.log
myprogram > out.log 2> err.log

# Send both stdout and stderr to out.log
myprogram &> out.log      # New bash syntax
myprogram > out.log 2>&1  # Older sh syntax

# Log output, hide errors.
myprogram > out.log 2> /dev/null
John Kugelman
quelle
15
Die Zeile "&>" ist eine kürzere Version von dem, was ich gerade gepostet habe. Ich bin noch nie auf diese Abkürzung gestoßen. Upvoting.
Chradcliffe
5
&>ist viel älter als Bash 4.
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams Können Sie möglicherweise die &>Einführung der Änderungsprotokolldokumentation verlinken ? : o
ThorSummoner
1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 gibt an, dass dies >>&in 4.0 eingeführt wurde. Es gibt keine Erwähnung, &>aber die ÄNDERUNGEN gehen nur auf 2.0 zurück. Ich denke, das bedeutet, dass es bereits in 1.x war.
Tripleee
git blameauf redir.cPunkte zu einem Commit von 1998 für das älteste Vorkommen, das sich noch in der aktuellen Codebasis befindet.
Tripleee
60

Leiten Sie stderr zu stdout um

Dadurch wird der stderr (der Deskriptor 2 ist) zum Dateideskriptor 1 umgeleitet, der der stdout ist.

2>&1

Stdout in Datei umleiten

Wenn Sie dies ausführen, leiten Sie das Standardout in die Datei um sample.s

myprogram > sample.s

Leiten Sie stderr und stdout in Datei um

Das Kombinieren der beiden Befehle führt dazu, dass sowohl stderr als auch stdout zu sample.s umgeleitet werden

myprogram > sample.s 2>&1

Leiten Sie stderr und stdout nach / dev / null um

Weiterleiten an, /dev/nullwenn Sie Ihre Anwendung vollständig stumm schalten möchten.

myprogram >/dev/null 2>&1
Debugger
quelle
13
Dem letzten fehlt ein Umleitungsoperator. es sollte sein myprogram >/dev/null 2>&1(beachten Sie den Keil vor /dev/nullund die Reihenfolge der Umleitungen).
Tripleee
2
wäre nicht myprogram &>/dev/nullgenug?
JaviOverflow
38

Alle Ausgaben:

scriptname &>/dev/null

Tragbar:

scriptname >/dev/null 2>&1

Tragbar:

scriptname >/dev/null 2>/dev/null

Für neuere Bash (kein tragbares):

scriptname &>-
Eduardo Cuomo
quelle
Das funktioniert nicht. Es erstellt tatsächlich eine Datei mit dem Namen -und &>ist eine nicht portable Bourne-Shell-Erweiterung.
PhilT
Das tragbare Äquivalent echo moo 1>&-erzeugt einen Fehler, weil Dateideskriptor 1 geschlossen ist:-bash: echo: write error: Bad file descriptor
Tripleee
11

Wenn Sie STDOUT und STDERR beide [alles] wollen, ist der einfachste Weg:

#!/bin/bash
myprogram >& sample.s

dann lauf es wie ./script folgt aus, und Sie erhalten keine Ausgabe an Ihr Terminal. :) :)

Das "> &" bedeutet STDERR und STDOUT. das &funktioniert genauso mit einem rohr: ./script |& sed das schickt alles an sed

Matt
quelle
7
man bash (unter "Standardausgabe und Standardfehler umleiten") sagt, dass &> und> & äquivalent sind, aber das erste (&>) wird bevorzugt. Dies ist jedoch die einzige Möglichkeit, dies für Rohre zu tun.
John Mellor
1
@ John Nein, der tragbare Weg für Rohre ista 2>&1 | b 2>&1 | c
Tripleee
9

Wenn Sie immer noch Schwierigkeiten haben, eine Antwort zu finden, insbesondere wenn Sie eine Datei für die Ausgabe erstellt haben und eine klare Alternative bevorzugen: echo "hi" | grep "use this hack to hide the oputut :) "

Henry H.
quelle
2
Interessanter Hack ... Upvoting für Klugheit ^ _ ^
skplunkerin
4

Versuche es mit:

myprogram &>/dev/null

keine Ausgabe erhalten

Swathi
quelle
0

Hinweis: Diese Antwort bezieht sich auf die Frage "So deaktivieren Sie das Echo beim Ausführen eines Linux-Shell-Skripts", die wiederum als zu diesem dupliziert markiert wurde.

Um das Echo tatsächlich auszuschalten, lautet der Befehl:

stty -echo

(Dies ist zum Beispiel der Fall, wenn Sie ein Kennwort eingeben möchten und nicht möchten, dass es lesbar ist. Denken Sie daran, das Echo am Ende Ihres Skripts einzuschalten, da sonst die Person, die Ihr Skript ausführt, nicht sieht, was sie ist / sie gibt von da an ein. Um das Echo beim Laufen einzuschalten:

stty echo

Berni
quelle
0

Nützlich in Skripten:


Holen Sie sich nur den STDERR in eine Datei, während Sie STDOUT ausblenden, auch wenn das auszublendende Programm überhaupt nicht vorhanden ist (hängt nie das übergeordnete Skript auf). Dies allein hat funktioniert:

stty -echo && ./programMightNotExist 2> errors.log && stty echo

Lösen Sie alles vollständig und bringen Sie alles zum Schweigen. Selbst das Beenden des übergeordneten Skripts wird nicht abgebrochen ./prog:

 ./prog </dev/null >/dev/null 2>&1 &
NVRM
quelle
0

Für die Ausgabe nur bei Fehler :

also [Befehl]

Logo

Alberto Salvia Novella
quelle