Why does the output format of time vary depending on how I call it
The first one is the bash
's own builtin keyword time
(compiled with bash
), and the second one is the external executable time
(/usr/bin/time
, comes with the time
package).
Also, which
can't show the shell's builtin commands or keywords as it just searches through PATH
, you need to use type
for that. Being a shell builtin itself, type
can additionally check for shell's internal entities (and also PATH
), so you can spot the difference by:
type -a time
Here:
$ type -a time
time is a shell keyword
time is /usr/bin/time
The first one will be executed if you just use time
. You can also get which is being executed by just using type
(without -a
):
type time
The -a
tells type
to search in shell's internal entities and also in PATH
i.e. search in all possible sources.
If for some reason you need the external one, use any one of:
\time
"time"
'time'
command time
Another difference between the builtin and external utilities is, that Bash's builtin time
will time complete pipelines or calls to shell functions (apparently even loops, but the manual doesn't seem to promise that). The external time
cannot, since being outside the shell, doesn't know about the surrounding code.
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
...
While time is specified in the standard, it's left unspecified how it should act in a pipeline, so a more powerful internal implementation like this is possible.