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.)