Questa domanda è affrontata in BashFAQ/032. Nel tuo esempio, dovresti:
{ time sleep 1; } 2> /dev/null
Il motivo
time sleep 1 2>/dev/null
non si comporta come ti aspetti perché con quella sintassi vorrai time
il comando sleep 1 2>/dev/null
(sì, il comando sleep 1
con stderr reindirizzato a /dev/null
). Il time
integrato funziona in questo modo in modo da renderlo effettivamente possibile.
Il bash
integrato può effettivamente farlo perché... beh, è un built-in. Tale comportamento sarebbe impossibile con il comando esterno time
di solito si trova in /usr/bin
. Infatti:
$ /usr/bin/time sleep 1 2>/dev/null
$
Ora, la risposta alla tua domanda
Perché l'output di alcuni programmi Linux non va né a STDOUT né a STDERR?
è:lo fa, l'output va a stdout o stderr .
Spero che questo aiuti!
La tua domanda particolare su time
builtin ha ricevuto una risposta, ma ci sono alcuni comandi che non scrivono nemmeno in stdout
o a stderr
. Un esempio classico è il comando Unix crypt
. crypt
senza argomenti crittografa l'input standard stdin
e lo scrive nello standard output stdout
. Richiede all'utente una password usando getpass()
, che per impostazione predefinita restituisce un prompt a /dev/tty
. /dev/tty
è il dispositivo terminale corrente. Scrivendo a /dev/tty
ha l'effetto di scrivere sul terminale corrente (se ce n'è uno, vedi isatty()
).
Il motivo crypt
non può scrivere a stdout
è perché scrive l'output crittografato in stdout
. Inoltre, è meglio chiedere a /dev/tty
invece di scrivere a stderr
in modo che se un utente reindirizza stdout
e stderr
, il prompt è ancora visibile. (Per lo stesso motivo, crypt
non riesco a leggere la password da stdin
, poiché viene utilizzato per leggere i dati da crittografare.)