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


14

それは初心者の質問かもしれませんが、私はこれがどのように構成されているのか、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


これはwhich基本的に役に立たない理由です...
バクリウ

回答:


23

1つ目はbashの独自の組み込みキーワードtime(でコンパイルbash)で、2つ目は外部実行可能ファイルですtime/usr/bin/timetimeパッケージに付属)です。

また、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

ああ、そうですね、whichビルトインを考慮しませんか?そして、私は常にtype -a最初に確認する必要があります。実際には、場所も出力typeするwhichため、より優れているようです/usr/bin/time
-xaxa

@xaxaええ、編集内容を確認してください。
heemayl

詳細な回答をありがとう!そのとき何がwhich便利ですか?
xaxa

1
@xaxa typeは確かに優れています--- bashを使用している場合。別のシェルには、typeブリチンもtime組み込みもありません。
jpaugh

2
@jpaugh正しくない。POSIXができますtimeだけでなく、外部であることをtypetypeすべてのPOSIX互換のシェルで利用可能です。
heemayl

4

ビルトインユーティリティと外部ユーティリティのもう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
...

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.