2017-09-02 10 views
0

Ich habe versucht, ein kleines Skript zu machen, als ich erkannte, dass die Ausgabeumleitung &> nicht innerhalb eines Skripts funktioniert. Wenn ich in der KlemmeWie stdout und stderr in Bash unterdrücken

dpkg -s firefox &> /dev/null 

oder

dpkg -s firefox 2>&1 /dev/null 

schreibe ich bekommen keine Ausgabe, aber wenn ich es in einem Skript einfügen wird die Ausgabe angezeigt werden soll. Das Merkwürdige ist, dass, wenn ich schreibe innerhalb das Skript

dpkg -s firefox 1> /dev/null 

oder

dpkg -s firefox 2> /dev/null 

die Ausgabe des Befehls unterdrückt wird. Wie kann ich sowohl stderr als auch stdout unterdrücken?

+0

Meinst du nicht "sowohl stdout und stderr unterdrücken"? – pedromss

+0

Ja sicher, mein Fehler! –

+1

Sind Sie sicher, dass das Skript mit '/ bin/bash' und nicht mit'/bin/sh' ausgeführt wird? Wie sieht die '#!' Zeile aus? '&>' ist eine 'bash'-Erweiterung, daher kann es in anderen Shells nicht funktionieren. – Barmar

Antwort

4

&> ist eine Bash-Erweiterung: entspricht dem POSIX-Standard >filename 2>&1.

Stellen Sie sicher, dass das Skript mit #!/bin/bash beginnt, damit es bash Erweiterungen verwenden kann. #!/bin/sh läuft eine andere Shell (oder es kann eine Verbindung zu bash sein, aber wenn es sieht, dass es unter diesem Namen läuft, wechselt es in einen POSIX-kompatiblen Modus).

Sie haben es fast richtig mit 2>&1 >/dev/null, aber die Reihenfolge ist wichtig. Umleitungen werden von links nach rechts ausgeführt, sodass Ihre Version das alte stdout in stderr kopiert und dann stdout an /dev/null umleitet.

3

Make Dateideskriptor 2 (stderr) schreiben, wo Dateideskriptor 1 (stdout) ist

Schreiben
dpkg -s firefox >/dev/null 2>&1 

Dies wird beide Quellen unterdrücken.