時間の出力形式が呼び出し方法によって異なるのはなぜですか

時間の出力形式が呼び出し方法によって異なるのはなぜですか

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の可能なソースを検索します。typePATH

何らかの理由で外部のものが必要な場合は、次のいずれかを使用します。

\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
...

時間が経つにつれ指定された標準では、パイプライン内でどのように動作するかは指定されていないため、このようなより強力な内部実装が可能です。

関連情報