สำหรับการใช้ debconf, ก่อนที่จะเรียก dpkg-กำหนดค่าคุณจะต้องยังเอาและ/etc/localtime
/etc/timezone
นอกจากนี้ระวังพื้นที่พิเศษที่อาจเกิดขึ้น (เช่นในคำถามของคุณ!) ซึ่งไม่เป็นพิษเป็นภัย
ดังนั้น "วิธี debconf" ที่ใช้งานได้ (ใน Debian Stretch) จะเป็น:
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 พยายามเป็นสมาร์ทและหากเคยมีการกำหนดค่าไว้ก่อนหน้านี้หรือผู้ใช้มีการเข้าไปยุ่งเกี่ยวกับเขตเวลาด้วยตนเองจะทำงานแตกต่างกัน
EXTRA
ในการแก้ปัญหาที่คล้ายกันด้วยตัวคุณเองคุณจะทำ:
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
จาก#!/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 จึงใช้ได้ หากมองในสคริปต์มากกว่านี้คุณจะพบว่า @andrekeller answer ยังทำงานในเวอร์ชัน Debian ที่ใหม่กว่าหากคุณลบ '/ etc / localtime'
หวังว่าการแก้จุดบกพร่องนี้จะช่วยคุณเมื่อ Debian เวอร์ชันต่อไปทำให้สคริปต์ทำงานได้อย่างชาญฉลาดยิ่งขึ้นและคำตอบที่มีอยู่ก็ไม่ถูกต้องเช่นกัน ข้อมูลเพิ่มเติมเกี่ยวกับการดีบัก debconf สามารถพบได้ในdebconf-devel (7)