При написании кода я обнаружил, что эта строка:
$ 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
После еще нескольких тестов я обнаружил, что это происходит только в некоторых оболочках. Это происходит в dash, ksh, но не в bash или zsh.
Q-х
Вопрос (ы):
- Почему значение TZ сохраняется в настоящей оболочке?
- Как этого можно избежать / контролировать (если это возможно)?
Дополнительно.
Я провел тесты в нескольких оболочках с этими двумя строками:
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.