我想設定一個腳本,自動更改電腦(運行 ubuntu 11.10)上的時區,並為資料庫設定正確的值debconf
。我已嘗試以下操作,但它不起作用(最後,當前時區保持不變,如果我手動運行命令dpkg-reconfigure tzdata
,所選值確實是舊值):
#!/bin/sh -e
echo "tzdata tzdata/Areas select Europe" | debconf-set-selections
echo "tzdata tzdata/Zones/Europe select Madrid" | debconf-set-selections
echo "tzdata tzdata/Zones/America select " | debconf-set-selections
dpkg-reconfigure -f noninteractive tzdata
/etc/localtime
所以,到目前為止,我正在直接弄亂文件/etc/timezone
,但我更喜歡這種dpkg-reconfigure
方式debconf
。
答案1
我所知道的最簡單的方法是:
echo "Europe/Zurich" > /etc/timezone
dpkg-reconfigure -f noninteractive tzdata
答案2
要使用 debconf,在呼叫 dpkg-reconfigure 之前,您還需要刪除/etc/localtime
和/etc/timezone
。也要注意可能的額外空間(如您的問題!),這不是良性的。
所以(在 Debian Stretch 中)有效的“debconf 方式”是:
echo "tzdata tzdata/Areas select Europe" | debconf-set-selections
echo "tzdata tzdata/Zones/Europe select Madrid" | debconf-set-selections
rm -f /etc/localtime /etc/timezone
dpkg-reconfigure -f noninteractive tzdata
原因是 tzdata 配置腳本試圖變得智能,如果之前配置過或用戶手動幹預過時區,則行為會有所不同。
額外的
要自行調試類似的問題,您首先需要執行以下操作:
export DEBCONF_DEBUG=developer
這將提供以下資訊:
# dpkg-reconfigure -f noninteractive tzdata
debconf (developer): starting /var/lib/dpkg/info/tzdata.config reconfigure 2018e-0+deb9u1
debconf (developer): <-- VERSION 2.0
debconf (developer): --> 0 2.0
debconf (developer): <-- CAPB backup
debconf (developer): --> 0 multiselect escape
debconf (developer): <-- SET tzdata/Areas Etc
debconf (developer): --> 0 value set
debconf (developer): <-- SET tzdata/Zones/Etc UTC
debconf (developer): --> 0 value set
debconf (developer): <-- INPUT high tzdata/Areas
debconf (developer): --> 30 question skipped
debconf (developer): <-- GO
debconf (developer): --> 0 ok
debconf (developer): <-- GET tzdata/Areas
debconf (developer): --> 0 Etc
debconf (developer): <-- INPUT high tzdata/Zones/Etc
debconf (developer): --> 30 question skipped
debconf (developer): <-- GO
debconf (developer): --> 0 ok
debconf (developer): starting /var/lib/dpkg/info/tzdata.postinst configure 2018e-0+deb9u1
debconf (developer): <-- VERSION 2.0
debconf (developer): --> 0 2.0
debconf (developer): <-- GET tzdata/Areas
debconf (developer): --> 0 Etc
debconf (developer): <-- GET tzdata/Zones/Etc
debconf (developer): --> 0 UTC
debconf (developer): <-- STOP
這會告訴你它有力地套在向使用者詢問這些值之前(從而覆寫您使用設定的值debconf-set-selections
)。
然後,您將 shebang 中的/var/lib/dpkg/info/tzdata.config
from更改#!/bin/sh
為#!/bin/sh -x
,並按照程序流程進行操作,您將看到它的作用:
+ [ -L /etc/localtime ]
+ readlink /etc/localtime
+ TIMEZONE=/usr/share/zoneinfo/Etc/UTC
看看 /var/lib/dpkg/info/tzdata.config
你會發現這個:
# If /etc/localtime is a link, update /etc/timezone
if [ -L /etc/localtime ] ; then
TIMEZONE="$(readlink /etc/localtime)"
這解釋了為什麼@fiction答案有效。另外,更多地查看腳本,您會發現如果刪除“/etc/localtime”,@andrekeller 答案也適用於較新的 Debian 版本。
希望當 Debian 的下一個版本使腳本變得更加聰明並且現有答案也變得無效時,此偵錯幫助將對您有所幫助。有關調試 debconf 的更多資訊可以在debconf-開發(7)
答案3
我剛剛發現使用 Debian Stretch (9) 您還需要更改 /etc/localtime,因此類似於:
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
是需要的。修改安德雷凱勒的回答你需要:
echo "Europe/Zurich" > /etc/timezone
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
dpkg-reconfigure -f noninteractive tzdata