ホームページ  >  記事  >  バックエンド開発  >  シェル(bash)での「time」コマンドの出力の詳細な説明

シェル(bash)での「time」コマンドの出力の詳細な説明

高洛峰
高洛峰オリジナル
2017-02-07 17:30:101680ブラウズ

前書き

time は bash の非常に便利なコマンドであることは誰もが知っていると思いますが、これは通常、プログラムの実行効率を大まかに比較するときに非常に便利です。ただし、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 コマンドに続くコマンド ライン全体を処理します。実際には、time コマンド自体の出力が処理されます。リダイレクトされません。

キーワード time はマークを設定します。タイミング情報は、command(find) コマンドが実行されるまで stderr に出力されません。 time キーワードを使用するには、コマンドとパイプライン全体、および関連するリダイレクトを進める必要があります。単純なリダイレクトが時間的に機能しないのはこのためです。 これは Bash 構文によって定義されます。コマンド後のリダイレクトは、時間に関するコマンドの一部です。

注: time コマンドの出力は標準エラー (stderr) に送信されます。

time コマンドが実行されると、コマンドは現在のシェルの次のレベルのシェル (つまり、時刻が設定されているシェル) で実行されます。コマンドが実行されます)、時間自体の出力は現在のシェルの標準エラー出力にあります。上記のようにリダイレクトすると、コマンドの stdout がテキスト ファイルにリダイレクトされるだけで、時間自体の出力はリダイレクトされません。

最初の解決策は、time コマンドと実行するコマンド ラインをシェル コード ブロック内に配置することです。つまり、スペースとセミコロンの使用に注意してください。

$ { 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

要約すると、{ time command-line; } 2>file 区切り文字の使用に注意してください。

もう 1 つの方法は、以下に示すようにサブシェル

を使用することです:

$ (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]#

2 番目の方法も要約すると、 (time コマンドライン) 2>file です。 ここで time は括弧に近いです。 ( もOKで、コマンドラインをセミコロンで終了する必要はありません。もちろん、サブシェルを開始するとより多くのリソースが消費されるため、最初の方法を使用するのが最善です。

まとめ

以上です。この記事は以上です。この記事の内容が皆さんの学習や仕事に少しでも役立つことを願っています。ご質問がある場合は、メッセージを残して連絡してください。「時間」の出力の詳細については、 " シェル (bash) の下のコマンド、PHP に注意してください。中国語の Web サイト!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。