Wie kann ich den Befehl stumm schalten?

9

Angenommen, ich mache eine rekursive ls

$ ls -R 

im Stammverzeichnis.

Ich bekomme viele Nachrichten wie diese -

ls: cannot open directory ./var/lib/sendmail: Permission denied
ls: cannot open directory ./var/lib/sudo: Permission denied
...

Gibt es eine Möglichkeit, die Anzeige der oben genannten " cannot open directory" Meldungen zu vermeiden ?

Code blau
quelle

Antworten:

24

Da es sich um Fehlermeldungen handelt, werden sie an stderr und nicht an stdout gesendet. Die Lösung ist, dass Sie stderr umleiten:

ls -R 2>/dev/null

Erläuterung:

Jeder Befehl verfügt über 3 Standard-Dateideskriptoren: Standardeingabe (0) (normalerweise das Terminal, an dem Sie Befehle eingeben), Standardausgabe (1) (normalerweise das Terminal, an dem der Befehl seine Ausgabe druckt) Standardfehler (2) (standardmäßig ist dies der wie Standardausgabe).

Die meisten (wenn nicht alle) Programme / Tools drucken Warnungen und Fehler in den Standard-Fehlerdateideskriptor. Jetzt wären die Dateideskriptoren nicht sehr nützlich, wenn sie repariert würden. Aus diesem Grund bietet die Shell eine Umleitung : Sie können jeden der Standard-Dateideskriptoren in eine beliebige Datei umleiten.

Stdin umleiten (um Eingaben von einer Datei anstatt von Ihrer Tastatur zu übernehmen):

interactive_program 0< file_with_answers

Wie Sie sehen, kann dies Ihnen helfen, die Ausführung einfacher Programme zu automatisieren, die viele Fragen stellen, indem Sie eine sogenannte "Antwortdatei" bereitstellen, die für die Standardeingabe bereitgestellt wird.

Dies kann auf verkürzt werden

 interactive_program < file_with_answers

wie das <die Umleitung klar macht ( von der Datei zum Programm)

Ebenso kann stdout über 1>...oder >...oder umgeleitet werden >>...(an eine vorhandene Datei anhängen, anstatt sie abzuschneiden)

Die Standard-Fehlerumleitung erfordert, dass Sie den Dateideskriptor explizit wie 2>...folgt angeben: Das oben Gesagte leitet alle Fehler an die spezielle Datei weiter, /dev/nulldie eine Art Schwarzes Loch für Bits darstellt.

Relevante Lektüre zur Weiterleitung, wie von MattDMo in den Kommentaren unten angegeben.

Joseph R.
quelle
was ist 2>? Kannst du bitte Erklären?
CodeBlue
3
Es ist ein Umleitungsbefehl. >leitet stdoutoder Standardausgabe, 2>Weiterleitungen stderroder Standardfehler um. 1>ist das gleiche wie >, so dass Sie sehen können, woher das 2kommt. Weitere Informationen zur E / A-Umleitung finden Sie hier im Linux-Dokumentationsprojekt.
MattDMo
@CodeBlue Siehe meine aktualisierte Antwort.
Joseph R.