Esta pregunta se aborda en BashFAQ/032. En tu ejemplo, harías lo siguiente:
{ time sleep 1; } 2> /dev/null
La razón por la cual
time sleep 1 2>/dev/null
no se comporta como espera porque con esa sintaxis, querrá time
el comando sleep 1 2>/dev/null
(sí, el comando sleep 1
con stderr redirigido a /dev/null
). El time
incorporado funciona de esa manera para que esto sea realmente posible.
El bash
integrado en realidad puede hacer esto porque... bueno, es un incorporado. Tal comportamiento sería imposible con el comando externo time
generalmente ubicado en /usr/bin
. De hecho:
$ /usr/bin/time sleep 1 2>/dev/null
$
Ahora, la respuesta a tu pregunta
¿Por qué la salida de algunos programas de Linux no va ni a STDOUT ni a STDERR?
es:lo hace, la salida va a stdout o stderr .
¡Espero que esto ayude!
Tu pregunta particular sobre time
incorporado ha sido respondido, pero hay hay algunos comandos que tampoco escriben en stdout
o al stderr
. Un ejemplo clásico es el comando de Unix crypt
. crypt
sin argumentos cifra la entrada estándar stdin
y lo escribe en la salida estándar stdout
. Solicita al usuario una contraseña usando getpass()
, que por defecto envía un aviso a /dev/tty
. /dev/tty
es el dispositivo terminal actual. Escribiendo a /dev/tty
tiene el efecto de escribir en el terminal actual (si hay uno, consulte isatty()
).
La razón crypt
no puedo escribir a stdout
es porque escribe la salida cifrada en stdout
. Además, es mejor preguntar a /dev/tty
en lugar de escribir a stderr
de modo que si un usuario redirige stdout
y stderr
, el indicador todavía se ve. (Por la misma razón, crypt
no puedo leer la contraseña de stdin
, ya que se usa para leer los datos para cifrar).