问题
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
回答1:
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
.
回答2:
Another way to know whether a command is a bash builtin command is to use the help
builtin command. The side effect is to get the information about said command (and supported command line arguments.)
bash$ help time
Report time consumed by pipeline's execution.
Execute PIPELINE and print a summary of the real time, user CPU time,
and system CPU time spent executing PIPELINE when it terminates.
Options:
-p print the timing summary in the portable Posix format
The value of the TIMEFORMAT variable is used as the output format.
Exit Status:
The return status is the return status of PIPELINE.
For non-builtin commands, help
says it does not know about it.
bash$ help ls
bash: help: no help topics match `ls'. Try `help help' or `man -k ls' or `info ls'.
回答3:
time is a builtin function in zsh. It is not in bash. If you want to use the /usr/bin/time version you need to supply the full path when using zsh.
It is also possible to disable this behavior using the "disable -r" command in zsh.
来源:https://stackoverflow.com/questions/19236448/shell-execution-time-vs-usr-bin-time