看一下这个
$ time echo 1
1
real 0m0.000s
user 0m0.000s
sys 0m0.000s
$ TESTVAR=TEST time echo 1
1
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 1932maxresident)k
0inputs+0outputs (0major+74minor)pagefaults 0swaps
我已经通过事先导出变量来解决这个问题,但我很想知道这是为什么。
(ubuntu 和 bash)
答案1
当您使用该ENV=val
表单时,您运行了与 bash 内置命令不同的命令time
(您从 运行 GNU 时间程序/usr/bin/time
)。
如果你想使用内置的 shell,可以这样使用:
$ time TESTVAR=TEST echo 1
1
real 0m0.000s
user 0m0.000s
sys 0m0.004s
$ time TESTVAR=TEST printenv TESTVAR
TEST
real 0m0.003s
user 0m0.004s
sys 0m0.000s
答案2
这与最近一个问题背后的原因密切相关:为什么 POSIX Shell Grammar 中的大括号命令组在左大括号后需要空格?
time
、 等{
是保留字,变量赋值后不能出现保留字。
bash-5.0$ foo=bar { echo $foo; }
bash: syntax error near unexpected token `}'
bash-5.0$ foo=bar if true; then echo; fi
bash: syntax error near unexpected token `then'
bash-5.0$ foo=bar if true
bash: if: command not found
由于time
不被识别为 中的保留字TESTVAR=TEST time echo 1
,因此它会执行正常的命令执行,寻找别名、函数和(在本例中,最终是)外部命令执行。