この質問は 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
からパスワードを読み取ることができません 、暗号化するデータの読み取りに使用されているためです。)