Environment-Variables

線上的環境變數搞亂了時間輸出

  • June 27, 2019

看一下這個

$ 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)

當您使用該表單時,您執行的命令與內置ENV=val的 bash 不同(您從 執行 GNU 時間程序)。time``/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

這與最近一個問題背後的原因密切相關:為什麼大括號命令組在 POSIX Shell Grammar 中的左大括號後需要空格?

time, like {, 是保留字,變數賦值後不能出現保留字。

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,因此它會進行正常的命令執行,查找別名、函式和(在這種情況下,最終以)外部命令執行。

引用自:https://unix.stackexchange.com/questions/527191