unbuffer コマンドが time コマンドに影響するのはなぜですか?

unbuffer コマンドが time コマンドに影響するのはなぜですか?

unbuffer コマンドを time コマンドと一緒に使用したときに、奇妙なことに気付きました。ここでは、システム内の特定のファイルを見つけるのにどのくらいの時間がかかるかを確認したいと思います。

time find . -name unixstuff

出力は次のようになります:

./Documents/CProgramming/2031/unix/Awk/unixstuff
0.011u 0.173s 0:00.38 47.3%     0+0k 0+0io 0pf+0w

しかし、このコマンドの前に unbuffer と記述すると、出力は次のようになります。

./Documents/CProgramming/2031/unix/Awk/unixstuff
0.01user 0.17system 0:00.38elapsed 47%CPU (0avgtext+0avgdata 4656maxresident)k
0inputs+0outputs (0major+338minor)pagefaults 0swaps

0.17s が 0.17system に展開され、その他のショートカットの展開も発生していることに注意してください。この動作の変更がなぜ発生するのかを知りたいです。パイプに予測できない出力は発生させたくないのです。

答え1

これは、time最初のコマンドの がシェル キーワードであるためです。2time番目のコマンドの は実行可能ファイルです。typeの出力を参照してくださいtime

$ type -a time
time is a shell keyword
time is /usr/bin/time

このコマンドには、unbufferシェル キーワードではなく、引数としてプログラムが必要です。シェル キーワードを解釈することはできません。これはbash内部キーワードです。

表示される出力の違いは、timeコマンドの 2 つの実装の違いです。最初のコマンドで絶対パスを使用するだけで、2 番目のコマンドと同じ動作が得られます。

/usr/bin/time find . -name unixstuff

関連情報