Post by Bob ProulxPost by Peng YuI thought that the first TIMEFORMAT set the environment variable for
`time` temporarily. But it apparently has no effect. Could anyone help
me understand why it is so? Thanks.
TIMEFORMAT=%3R time sleep 1
1.00 real 0.00 user 0.00 sys
export TIMEFORMAT=%3R
time sleep 1
1.018
Inside bash 'time' is a shell keyword. Outside of bash 'time' is a
standalone utility.
$ type -a time
time is a shell keyword
time is /usr/bin/time
Why two? Because in bash 'time' will time the full command pipeline.
An external command cannot do that and would only be able to time one
command at a time. One would need to construct a time sh -c 'A | B'
type of thing in order to have the external 'time' work on a single
command line command. That is why 'time' is a shell keyword. It
needs to be special in order to time a pipeline of commands.
Therefore the shell syntax to set a variable for just one command
cannot be used before 'time' to set it. Doing so causes it to invoke
the external command.
You can always use the external GNU time command.
$ env TIME=%e time sleep 2.35
2.35
It seems that `time` is special in the aspect of whether an inline
environment variable can be set or not. Is it documented somewhere in
the manual? Thanks.
$ cat help
#!/usr/bin/env bash
# vim: set noexpandtab tabstop=2:
declare -p BASH_SOURCE
$ cat time
#!/usr/bin/env bash
# vim: set noexpandtab tabstop=2:
declare -p BASH_SOURCE
$ cat ./main.sh
#!/usr/bin/env bash
# vim: set noexpandtab tabstop=2:
set -v
X=10 help | head -n 1
TIMEFORMAT=%R time sleep 1
export PATH=".:$PATH"
X=10 help | head -n 1
TIMEFORMAT=%R time sleep 1
$ ./main.sh
X=10 help | head -n 1
GNU bash, version 4.4.19(1)-release (x86_64-apple-darwin17.3.0)
TIMEFORMAT=%R time sleep 1
1.01 real 0.00 user 0.00 sys
export PATH=".:$PATH"
X=10 help | head -n 1
GNU bash, version 4.4.19(1)-release (x86_64-apple-darwin17.3.0)
TIMEFORMAT=%R time sleep 1
declare -a BASH_SOURCE=([0]="./time")
--
Regards,
Peng