线路上的环境变量弄乱了时间输出

线路上的环境变量弄乱了时间输出

看一下这个

$ 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,因此它会执行正常的命令执行,寻找别名、函数和(在本例中,最终是)外部命令执行。

相关内容