Tato otázka je řešena v BashFAQ/032. Ve vašem příkladu byste:
{ time sleep 1; } 2> /dev/null
Důvod proč
time sleep 1 2>/dev/null
se nechová tak, jak očekáváte, protože s touto syntaxí budete chtít time
příkaz sleep 1 2>/dev/null
(ano, příkaz sleep 1
s stderr přesměrován na /dev/null
). Vestavěný time
funguje tak, aby to bylo skutečně možné.
bash
vestavěné může to vlastně udělat, protože... no, je to vestavěný. Takové chování by bylo nemožné s externím příkazem time
obvykle umístěn v /usr/bin
. Opravdu:
$ /usr/bin/time sleep 1 2>/dev/null
$
Nyní odpověď na vaši otázku
Proč výstup některých linuxových programů nejde ani do STDOUT, ani do STDERR?
je:ano, výstup jde do stdout nebo stderr .
Doufám, že to pomůže!
Vaše konkrétní otázka o time
vestavěný byl zodpovězen, ale existují některé příkazy nezapisují ani do stdout
nebo na stderr
. Klasickým příkladem je unixový příkaz crypt
. crypt
bez argumentů zašifruje standardní vstup stdin
a zapíše jej na standardní výstup stdout
. Vyzve uživatele k zadání hesla pomocí getpass()
, což ve výchozím nastavení zobrazí výzvu na /dev/tty
. /dev/tty
je aktuální koncové zařízení. Zápis na /dev/tty
má účinek zápisu na aktuální terminál (pokud existuje, viz isatty()
).
Důvod crypt
nelze zapisovat na stdout
je to proto, že zapisuje šifrovaný výstup na stdout
. Také je lepší požádat o /dev/tty
místo zápisu do stderr
takže pokud uživatel přesměruje stdout
a stderr
, výzva se stále zobrazuje. (Ze stejného důvodu crypt
nelze přečíst heslo z stdin
, protože se používá ke čtení dat za účelem šifrování.)