2009-05-30 3 views
19

Es ist wirklich ärgerlich, dies zu tippen, wenn ich die Ausgabe eines Programms nicht sehen möchte. Ich würde gerne wissen, ob es ein kürzerer Weg ist, zu schreiben:Gibt es eine Befehlszeilenverknüpfung für ">/dev/null 2> & 1"

$ program >/dev/null 2>&1 

Generisches Shell ist die beste, aber auch andere Muscheln wären interessant zu wissen auch, besonders bash oder Bindestrich.

Antwort

14
>& /dev/null 
+0

Danke, das ist gut (wusste das nicht), aber ich hätte angegeben, dass "Abkürzung" weniger als die Hälfte der Anzahl der Zeichen bedeutet. Das ist fast so viel Tippen. In der Tat ist der 2> & 1-Teil einfach, es ist/dev/null, was das Tippen nervig macht. –

+3

Ich bin wirklich neugierig zu wissen, was Sie laufen, die Sie dazu zwingt, stdout und stderr zu/dev/null so häufig zu pipettieren, dass das Schreiben von/dev/null ein Ärgernis wird. –

+7

Bash Handbuch bevorzugt die Form "&>/dev/null", um mögliche Mehrdeutigkeiten mit "> & n" zu vermeiden (wobei n eine ganze Zahl ist). Ich glaube nicht, dass es außerhalb von Bash tragbar ist. – ephemient

1

Wenn /dev/null zu viel zu geben, könnten Sie (als root) so etwas wie:

ln -s /dev/null /n 

Dann könnten Sie gerade tun:

program >/n 2>&1 

Aber natürlich Skripte Sie schreiben auf diese Weise nicht zu anderen Systemen, ohne diesen Symlink zuerst einzurichten.

+0

Kombinieren mit der Antwort oben, ich denke, ich könnte tun: Programm &>/n was ziemlich gut ist. Vielen Dank! –

+1

hätte sein sollen Programm> &/n –

6

Die meisten Shells unterstützen Aliase. Zum Beispiel in meinem .zshrc habe ich Dinge wie:

alias -g no='2> /dev/null > /dev/null' 

Dann tippe ich nur

program no 
+2

In bash, das wäre: alias no = '2>/dev/null>/dev/null'; kein Befehl arg arg – lhunath

13

Sie können eine Funktion für diesen schreiben:

function nullify() { 
    "[email protected]" >/dev/null 2>&1 
} 

diese Funktion nutzen zu können:

nullify program arg1 arg2 ... 

Natürlich können Sie t nennen er funktioniert, was immer du willst. Es kann zum Beispiel ein einzelnes Zeichen sein.

Übrigens können Sie exec verwenden, um stdout und stderr vorübergehend zu /dev/null umzuleiten. Ich weiß nicht, ob das in deinem Fall hilfreich ist, aber ich dachte daran, es zu teilen.

# Save stdout, stderr to file descriptors 6, 7 respectively. 
exec 6>&1 7>&2 
# Redirect stdout, stderr to /dev/null 
exec 1>/dev/null 2>/dev/null 
# Run program. 
program arg1 arg2 ... 
# Restore stdout, stderr. 
exec 1>&6 2>&7 
0

Scheint mir, dass die meisten tragbaren Lösung und beste Antwort wäre ein Makro auf Ihrem Terminal (PC) sein.

Auf diese Weise, egal auf welchem ​​Server Sie sich anmelden, wird es immer da sein.

Wenn Sie Windows ausführen, können Sie das gewünschte Ergebnis mit AHK (google es, es ist Opensource) in zwei kleinen Zeilen Code erhalten. Das kann jede Schlüsselreihe in eine andere Schlüsselreihe in situ übersetzen.

Sie geben "hässlich.sh >> NULL" ein und es wird es als "hässlich.sh 2> & 1>/dev/null" umschreiben oder was nicht.

Lösungen für andere Plattformen sind etwas schwieriger. AppleScript kann beim Drücken der Tastatur eingefügt werden, kann aber nicht so einfach ausgelöst werden.

8

In bash, zsh und Strich:

$ program >&- 2>&- 

Es kann auch erscheinen in anderen Shells zu arbeiten, weil &- eine schlechte Dateideskriptor ist.

Beachten Sie, dass diese Lösung die Dateideskriptoren schließt, anstatt sie an /dev/null umzuleiten, was möglicherweise dazu führen kann, dass Programme abgebrochen werden.

+0

"Kann möglicherweise"? Ich würde das "normalerweise" nennen. Programme, die nicht überprüfen, ob ihre Schreibvorgänge erfolgreich sind, sind * fehlerhaft *. –

+0

Wenn ich recht habe, ist 'sh' der Name der Standard-Shell für eine gegebene Distribution, während' dash' der Name ist, der der Debian-Version von 'ash' gegeben wird. Siehe [Wikipedia] (https://en.wikipedia.org/wiki/Dash_ (Shell)). Könnten Sie bitte klären? – loxaxs

+0

@loxaxs: In Ubuntu läuft 'sh' jetzt' dash'. Ich kann mich nicht erinnern, was es zum Zeitpunkt des Schreibens für mich getan hat (ich erinnere mich an etwas, das 'bash' im POSIX-Kompatibilitätsmodus ausführt), aber ich habe es wegen der Mehrdeutigkeit jetzt entfernt. – Zaz

2

Es ist auch erwähnenswert, dass oft Umleitung Ausgabe ist nicht wirklich notwendig. Viele Unix- und Linux-Programme akzeptieren ein "stilles Flag", normalerweise -n oder -q, das jede Ausgabe unterdrückt und nur einen Wert bei Erfolg oder Fehlschlag zurückgibt.

Zum Beispiel

grep foo bar.txt >/dev/null 2>&1 
if [ $? -eq 0 ]; then 
    do_something 
fi 

Kann als

grep -q foo bar.txt 
if [ $? -eq 0 ]; then 
    do_something 
fi 
+0

"$?" Unnötig zu überprüfen, ist eine schlechte Form, im Gegensatz zu "if grep -q foo bar.txt; dann - macht es Ihren Code zerbrechlich, so dass neu hinzugefügte Protokollzeilen Ihre Tests unterbrechen können, wenn jemand, der solche Log-Instrumentierung macht, nicht vorsichtig damit ist, wo '$?' erwartet wird, unverändert zu bleiben. –

2

bearbeiten neu geschrieben werden: Die (:) oder |: basierten Lösungen möglicherweise einen Fehler verursachen, weil : nicht stdin liest. Obwohl es nicht so schlimm ist wie das Schließen des Dateideskriptors, wie in Zaz 'Antwort vorgeschlagen.


  • Für bash und bash-kompatible Shells (zsh ...):

    $ program &>/dev/null 
    OR 
    $ program &> >(:) # Should actually cause error or abortion 
    
  • Für alle Schalen:

    $ program 2>&1 >/dev/null 
    OR 
    $ program 2>&1|: # Should actually cause error or abortion 
    

    $ program 2>&1 > >(:) funktioniert nicht für Strich, weil es weigert sich, das Prozesssubstitutionsrecht einer Dateisubstitution zu betreiben.

Erklärung:

  • 2>&1 umleitet Stderr (Dateideskriptor 2) in stdout (Dateideskriptor 1).
  • | ist die reguläre Verrohrung von stdout zur stdin eines anderen Befehls.
  • : ist eine Shell-Builtin, die nichts tut (es entspricht true).
  • &> leitet beide stdout und stderr Ausgaben in eine Datei um.
  • >(your-command) ist Prozesssubstitution. Es wird durch einen Pfad zu einer speziellen Datei ersetzt, zum Beispiel: /proc/self/fd/6. Diese Datei wird als Eingabedatei für den Befehl your-command verwendet.

Hinweis: Ein Prozess versucht, in eine geschlossenen Dateideskriptor zu schreiben, wird eine EBADF (schlechte Dateideskriptor) Fehlermeldung erhalten, die wahrscheinlicher ist, Abtreibung zu verursachen, als zu versuchen zu | true zu schreiben. Letzteres würde einen EPIPE (Pipe) Fehler verursachen, siehe Charles Duffys Kommentar.

+0

Ich würde nicht ganz "Äquivalent" sagen; '> & -' * eigentlich * schließt den Deskriptor, und das Verhalten ist ziemlich anders (schreibt in ein geschlossenes und somit nicht existierendes FD führt zu einem anderen, wahrscheinlicher-zu-fatalen Fehler). –

+0

Vergleichen Sie 'python -c 'print" Hallo "'> & -', 'python -c 'drucken" Hallo "' | true 'und' python -c 'print "Hallo"'>/dev/null'. – loxaxs

+1

'... | true gibt 'EPIPE' zurück, während '> & -' 'EBADF' zurückgibt - zwei völlig separate Fehler. Dass die Python-Laufzeit nicht sinnvoll zwischen ihnen unterscheidet, ist weder hier noch dort. –

1

Ayman Hourieh's solution funktioniert gut für einmalige Aufrufe von übermäßig gesprächige Programme. Aber wenn es nur eine kleine Gruppe von häufig aufgerufenen Programme für die Sie die Ausgabe unterdrücken wollen, sollten Sie sie zum Schweigen zu bringen, indem Sie die folgenden auf Ihre .bashrc Datei hinzufügen (oder das Äquivalent, wenn Sie verwenden eine andere Shell):

CHATTY_PROGRAMS=(okular firefox libreoffice kwrite) 
for PROGRAM in "${CHATTY_PROGRAMS[@]}" 
do 
    printf -v eval_str '%q() { command %q "[email protected]" &>/dev/null; }' "$PROGRAM" "$PROGRAM" 
    eval "$eval_str" 
done 

Diese So können Sie weiterhin Programme mit ihren üblichen Namen aufrufen, aber ihre stdout- und stderr-Ausgabe wird im Bit-Bucket verschwinden.

Beachten Sie auch, dass bestimmte Programme Ihnen erlauben zu konfigurieren, wie viel Logging/Debugging-Ausgabe sie ausspucken. Für KDE-Anwendungen können Sie kdebugdialog ausführen und die Debugging-Ausgabe selektiv oder global deaktivieren.

+1

Warum verwenden Sie eine Zeichenfolge als wäre es eine Liste? Wenn Sie native bash schreiben (und das 'function'-Schlüsselwort bedeutet, dass Ihr Code * nicht * versucht, tragbar zu sein; POSIX), dann haben Sie garantiert Arrays; 'chatty_programs = (okular firefox was auch immer); für das Programm in "$ {chatty_programs [@]}"; tun '; Auf diese Weise hängt Ihr Code nicht vom aktuellen Wert von IFS ab. –

+1

Ich würde auch in Erwägung ziehen, die Shell das Quoting für Sie ausführen zu lassen: 'printf -v eval_str '% q() {Befehl% q" $ @ "&>/dev/null; } '"$ program" "$ program"; eval "$ eval_str" '- Wenn also jemand das Idiom ausborgt und es mit Namen ausführt, die er nicht kontrolliert, erzeugt ein Joker ein Skript namens' $ (rm -rf ~) '(ja, das ist ein gültiger Dateiname - - Achten Sie darauf, einfache Anführungszeichen zu verwenden, wenn Sie versuchen, es zu erstellen) wird sie keinen schlechten Tag verursachen. –

+0

@CharlesDuffy: Sie haben Recht; Danke für die vorgeschlagenen Verbesserungen. Ich habe meine Antwort entsprechend überarbeitet. – Psychonaut