Trong khi viết một số mã tôi phát hiện ra rằng dòng này:
$ TZ="America/Los_Angeles" date; echo "$TZ"
Thu Dec 24 14:39:15 PST 2015
Chính xác đưa ra thời gian thực tế tại "Los Angeles" và giá trị của biến TZ
không được giữ lại. Tất cả như dự kiến.
Tuy nhiên, với dòng này, mà tôi đã sử dụng để mở rộng một số định dạng và về cơ bản thực hiện điều tương tự, vẫn giữ nguyên giá trị của TZ:
TZ="America/Los_Angeles" eval date; echo "$TZ"
Thu Dec 24 14:41:34 PST 2015
America/Los_Angeles
Sau nhiều thử nghiệm, tôi phát hiện ra rằng điều này chỉ xảy ra ở một số vỏ. Nó xảy ra trong dash, ksh nhưng không phải trong bash hoặc zsh.
Q
Câu hỏi là:
- Tại sao giá trị của TZ được giữ lại trong vỏ hiện tại?
- Làm thế nào mà có thể tránh / kiểm soát (nếu có thể)?
Bổ sung.
Tôi đã chạy thử nghiệm trong một số shell với hai dòng này:
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"
Và kết quả này:
/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
Giá trị TZ ảnh hưởng đến shell đang chạy trong tất cả các shell ngoại trừ bash và zsh.