emish emish - 4 months ago 13
Bash Question

Shell execution: time vs. /usr/bin/time

What is going on when bash/zsh does the following:

~ » /usr/bin/time -l sleep 1
1.00 real 0.00 user 0.00 sys
516096 maximum resident set size
0 average shared memory size
0 average unshared data size
0 average unshared stack size
145 page reclaims
0 page faults
0 swaps
0 block input operations
0 block output operations
0 messages sent
0 messages received
0 signals received
0 voluntary context switches
2 involuntary context switches
------------------------------------------------------------
~ » time -l sleep 1
zsh: command not found: -l
-l sleep 1 0.00s user 0.00s system 52% cpu 0.001 total
------------------------------------------------------------
~ » /usr/bin/time foo
foo: No such file or directory
0.00 real 0.00 user 0.00 sys
------------------------------------------------------------
~ » time foo
zsh: command not found: foo
foo 0.00s user 0.00s system 52% cpu 0.001 total


Why does it make a difference how I use time, and why is zsh trying to execute
-l
??

Curiously, zsh says

~ » which time
time: shell reserved word


While bash doesn't:

~ » bash
bash-3.2$ which time
/usr/bin/time
bash-3.2$ time foo
bash: foo: command not found

real 0m0.006s
user 0m0.000s
sys 0m0.003s
bash-3.2$ /usr/bin/time foo
foo: No such file or directory
0.00 real 0.00 user 0.00 sys
bash-3.2$ time -l sleep 1
bash: -l: command not found

real 0m0.001s
user 0m0.000s
sys 0m0.001s
bash-3.2$ /usr/bin/time -l sleep 1
1.00 real 0.00 user 0.00 sys
516096 maximum resident set size
0 average shared memory size
0 average unshared data size
0 average unshared stack size
144 page reclaims
0 page faults
0 swaps
0 block input operations
1 block output operations
0 messages sent
0 messages received
0 signals received
2 voluntary context switches
2 involuntary context switches

Answer

time is builtin in both zsh and bash. However, which is only built-in to zsh. In bash, when you use which it runs /usr/bin/which which has no idea about shell built-ins.

So in bash, you should use:

$ type time
time is a shell keyword

The reason time -l ... doesn't work is that the time syntax doesn't include the -l flag.

In both cases, it's not really correct to say that time is a built-in function. Calling it a "reserved word" or "shell keyword" is more accurate, because it applies to an entire pipeline; it cannot be implemented as a function or external command. In that sense, it is similar to other syntactic elements like if and while.

Comments