在编写一些代码时,我发现这一行:
$ TZ="America/Los_Angeles" date; echo "$TZ"
Thu Dec 24 14:39:15 PST 2015
正确给出“洛杉矶”的实际时间,并且TZ
不保留变量的值。一切都应该预期。
但是,使用此行(我以前用来扩展某些格式,并且基本上执行相同的操作)保留了TZ的值:
TZ="America/Los_Angeles" eval date; echo "$TZ"
Thu Dec 24 14:41:34 PST 2015
America/Los_Angeles
经过多次测试后,我发现这仅在某些shell中发生。它发生在破折号,ksh中,但不发生在bash或zsh中。
Q的
问题是:
- 为什么现在的外壳中保留TZ的值?
- 如何避免/控制这种情况(如果可能)?
额外。
我使用以下两行在几个shell中运行测试:
myTZ="America/Los_Angeles"
unset TZ; { TZ="$myTZ" date; } >/dev/null; echo -n " direct $TZ"
unset TZ; { TZ="$myTZ" eval date; } >/dev/null; echo " evaled $TZ"
结果如下:
/bin/ash : direct evaled America/Los_Angeles
/bin/dash : direct evaled America/Los_Angeles
/bin/sh : direct evaled America/Los_Angeles
/bin/bash : direct evaled
/bin/ksh93 : direct evaled America/Los_Angeles
/bin/lksh : direct evaled America/Los_Angeles
/bin/mksh : direct evaled America/Los_Angeles
/bin/zsh : direct evaled
/bin/zsh4 : direct evaled
TZ值会影响除bash和zsh之外的所有shell中正在运行的shell。