
time
初心者の質問かもしれませんが、これがどのように構成されているのか、また、次の 2 つのケースでコマンドの出力形式が異なる理由がわかりません。
経由で使用した場合time
、出力は基本情報を含む3行になります。
$ time sleep 1
real 0m1.003s
user 0m0.000s
sys 0m0.000s
どのバイナリが使用されているか確認できます
$ which time
/usr/bin/time
直接呼び出すと、まったく異なる形式で、より多くの情報を含む出力が得られます。
$ /usr/bin/time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 2000maxresident)k
0inputs+0outputs (0major+77minor)pagefaults 0swaps
関連するエイリアスはありませんtime
$ alias | grep time
$
走っていますUbuntu 16.04
。
答え1
最初のものはbash
の独自の組み込みキーワードtime
( でコンパイルbash
) であり、2 番目は外部実行可能ファイルtime
( /usr/bin/time
、パッケージに付属time
) です。
また、which
は を検索するだけなのでPATH
、シェルの組み込みコマンドやキーワードを表示できません。そのためには を使用する必要がありますtype
。 はシェルの組み込みコマンドであるため、type
はシェルの内部エンティティ (およびPATH
) をさらにチェックできるため、次のようにして違いを見つけることができます。
type -a time
ここ:
$ type -a time
time is a shell keyword
time is /usr/bin/time
だけを使用すると、最初のものが実行されます。 だけを使用して( なし) time
、実行されている を取得することもできます。type
-a
type time
シェルの内部エンティティを検索するように指示し、つまりすべて-a
の可能なソースを検索します。type
PATH
何らかの理由で外部のものが必要な場合は、次のいずれかを使用します。
\time
"time"
'time'
command time
答え2
組み込みユーティリティと外部ユーティリティのもう1つの違いは、Bashの組み込みtime
パイプラインの完了時間を計るまたは、シェル関数の呼び出し (ループも可能のようですが、マニュアルではそれが保証されていないようです)。外部はtime
シェルの外部にあるため、周囲のコードについて認識できないため、できません。
bash$ time echo blah | sleep 3
real 0m3.002s
...
bash$ /usr/bin/time echo blah | sleep 3
0.00user 0.00system 0:00.00elapsed ?%CPU
...
bash$ time for x in 1 2 3 ; do sleep 1 ; done
real 0m3.006s
...
時間が経つにつれ指定された標準では、パイプライン内でどのように動作するかは指定されていないため、このようなより強力な内部実装が可能です。