Diese Frage wird in BashFAQ/032 behandelt. In Ihrem Beispiel würden Sie:
{ time sleep 1; } 2> /dev/null
Der Grund warum
time sleep 1 2>/dev/null
sich nicht so verhält, wie Sie es erwarten, weil Sie mit dieser Syntax time
möchten den Befehl sleep 1 2>/dev/null
(Ja, der Befehl sleep 1
mit stderr umgeleitet zu /dev/null
). Die eingebaute time
funktioniert so, dass dies tatsächlich möglich ist.
Die bash
eingebaut kann dies tatsächlich tun, weil ... nun, es ist ein eingebautes. Ein solches Verhalten wäre mit dem externen Befehl time
nicht möglich befindet sich normalerweise in /usr/bin
. Tatsächlich:
$ /usr/bin/time sleep 1 2>/dev/null
$
Nun die Antwort auf Ihre Frage
Warum geht die Ausgabe einiger Linux-Programme weder zu STDOUT noch zu STDERR?
ist:es geht, die Ausgabe geht an stdout oder stderr .
Hoffe, das hilft!
Ihre spezielle Frage zu time
builtin wurde beantwortet, aber es gibt einige Befehle, die auch nicht in stdout
schreiben oder an stderr
. Ein klassisches Beispiel ist der Unix-Befehl crypt
. crypt
ohne Argumente verschlüsselt die Standardeingabe stdin
und schreibt es auf die Standardausgabe stdout
. Es fordert den Benutzer mit getpass()
zur Eingabe eines Passworts auf , die standardmäßig eine Eingabeaufforderung an /dev/tty
ausgibt . /dev/tty
ist das aktuelle Endgerät. Schreiben nach /dev/tty
bewirkt, dass in das aktuelle Terminal geschrieben wird (falls vorhanden, siehe isatty()
).
Der Grund crypt
kann nicht auf stdout
schreiben liegt daran, dass es verschlüsselte Ausgaben in stdout
schreibt . Außerdem ist es besser, zu /dev/tty
aufzufordern anstatt in stderr
zu schreiben damit, wenn ein Benutzer stdout
umleitet und stderr
, wird die Eingabeaufforderung immer noch angezeigt. (Aus dem gleichen Grund crypt
kann das Passwort von stdin
nicht lesen , da es zum Lesen der zu verschlüsselnden Daten verwendet wird.)