この質問は BashFAQ/032 で取り上げられています。あなたの例では:
{ time sleep 1; } 2> /dev/null
その理由
time sleep 1 2>/dev/null
期待どおりに動作しないのは、その構文で time したいからです コマンド sleep 1 2>/dev/null (はい、コマンド sleep 1 stderr で /dev/null にリダイレクト )。組み込みの time これを実際に可能にするために、そのように機能します。
bash ビルトイン 実際にこれを行うことができます...まあ、それは組み込みです。このような動作は、外部コマンド time では不可能です。 通常は /usr/bin にあります .確かに:
$ /usr/bin/time sleep 1 2>/dev/null
$
さて、あなたの質問への答え
<ブロック引用>一部の Linux プログラムの出力が STDOUT にも STDERR にも出力されないのはなぜですか?
is:そうです、出力は stdout に送られます または stderr .
これがお役に立てば幸いです!
time に関する特定の質問 builtin は回答済みですが、ある stdout にも書き込まないいくつかのコマンド または stderr へ .古典的な例は、Unix コマンドの crypt です。 . crypt 引数なしで標準入力 stdin を暗号化します そしてそれを標準出力 stdout に書き込みます . getpass() を使用してユーザーにパスワードを要求します 、これはデフォルトでプロンプトを /dev/tty に出力します . /dev/tty 現在の端末デバイスです。 /dev/tty への書き込み 現在の端末に書き込む効果があります (ある場合は、isatty() を参照してください) ).
理由 crypt stdout に書き込めません 暗号化された出力を stdout に書き込むためです .また、/dev/tty にプロンプトを表示することをお勧めします。 stderr に書き込む代わりに ユーザーが stdout をリダイレクトした場合 と stderr 、プロンプトは引き続き表示されます。 (同じ理由で crypt stdin からパスワードを読み取ることができません 、暗号化するデータの読み取りに使用されているためです。)