shell(bash)下「time」コマンドの出力詳細


前言
bashの下でtimeは有用な命令であることを皆さんが知っていると思います。それはシナリオやプログラムの実行のための時間計測ができます。これは通常、プログラムの実行効率を大まかに比較する時に便利です。しかし、timeコマンドが出力した時間テキストは簡単にリダイレクトできないことが分かります。例えば、テキストファイルにリダイレクトすると、画面にしか表示できません。これは非インタラクティブタイミングに不便です。
たとえば:

$ time find . -name "mysql.sh" >1.txt

real 0m0.081s
user 0m0.060s
sys  0m0.020s

$ time find . -name "mysql.sh" 2>2.txt
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh

real 0m0.068s
user 0m0.040s
sys  0m0.030s
上記の試みによって、timeの出力情報をファイルに転送できないことが分かりました。なぜですか?timeはshellのキーワードであるため、shellは特殊な処理を施しており、timeコマンドの後のコマンドラインを全体として処理しています。リダイレクト時には、実際には後のコマンドに対して来ています。timeコマンド自体の出力はリダイレクトされません。
キーワードタイムには、command(find)コマンドの実行が完了したことを知っているタグが設定されています。timing情報はstderに印刷されます。timeのキーワードは全体のcommandとパイプを要して、あります関連しているリダイレクトはすべて来るのが高級です。これはなぜ簡単なリダイレクトがtimeには機能しないのですか?これはBash文法で定義されています。commandの後のリダイレクトはtimeにとって、commandの一部です。
注:timeコマンドの出力は標準エラー(stder)になります。
タイムコマンドが実行されると、現在のshell(つまり、timeコマンドが実行するshell)の次のレベルshellにcommmandが実行され、time自身の出力は現在のshellのstderにあります。上に示したようにリダイレクトすると、mandのstdoutがテキストファイルにリダイレクトされ、time自身の出力内容は出力されません。
第一の解決方法としては、タイムコマンドと実行するコマンドラインをshellコードブロックの中に置く、つまり大かっこのペアです。スペースとセミコロンの使用に注意してください。

$ { time find . -name "mysql.sh"; } 2>2.txt
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
$ cat 2.txt

real 0m0.068s
user 0m0.030s
sys  0m0.040s
第1の方法の試みは成功しました。まとめて { time command-line; } 2>file  は、セパレータの使用に注意しています。
もう一つの方法は子シェルを使う方式です。
以下の通りです

$ (time find . -name "mysql.sh") 2>2.txt
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
$ cat 2.txt

real 0m0.083s
user 0m0.040s
sys  0m0.020s
[root@web186 root]#
第二の方法の試みも成功しました。まとめてみると、(time command-line) 2>file ここのtimeは括弧にくっついています。もちろん一番いいのはやはり第一の方法でした。結局、息子のshellを起動するには、もっと多くの資源を占めるべきです。
締め括りをつける
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に一定の助けをもたらしてほしいです。もし疑問があれば、メッセージを残して交流してもいいです。