Hello,

(tested with bash-4.3 and bash-2.05b)

"time" is meant to time a pipeline. That generally includes
redirections of the last command in the pipeline, but in the
case of a subshell alone, the redirection is not timed(*) and
seems to affect the output of "time" itself.

That's quite inconsistent, and different from other shells.

$ bash -c 'time (uname) 2> /dev/null'
Linux
$ bash -c 'time uname 2> /dev/null'
Linux

real    0m0.002s
user    0m0.000s
sys     0m0.001s
$ bash -c 'time { uname;} 2> /dev/null'
Linux

real    0m0.001s
user    0m0.000s
sys     0m0.001s
$ bash -c 'time (uname) | wc -c 2> /dev/null'
6

real    0m0.002s
user    0m0.000s
sys     0m0.003s
$ bash -c 'time (uname) | (wc -c) 2> /dev/null'
6

real    0m0.003s
user    0m0.000s
sys     0m0.003s
$ bash -c 'time (uname) 2> /dev/null | (wc -c) 2> /dev/null'
6

real    0m0.002s
user    0m0.001s
sys     0m0.002s
$ ksh -c 'time (uname) 2> /dev/null'
Linux

real    0m0.00s
user    0m0.00s
sys     0m0.00s
$ zsh -c 'time (uname) 2> /dev/null'
Linux
( uname; ) 2> /dev/null  0.00s user 0.00s system 89% cpu 0.002 total
$ mksh -c 'time (uname) 2> /dev/null'
Linux
    0m0.00s real     0m0.00s user     0m0.00s system



Is there a reason for that?

Note that it may be too late to change it as some people seem to
rely on it. See for instance:

https://unix.stackexchange.com/questions/12068/how-to-measure-time-of-program-execution-and-store-that-inside-a-variable/12069#12069

But it could be worth documenting.

(*)

well, time (cmd) < <(busy-cmd)
does seem to time "busy-cmd".

-- 
Stephane

Reply via email to