我正在将为 Arch 编写的 shell 脚本移植到 Debian。
相关部分:
keymaps=$(localectl list-keymaps)
if test -n "${1}" && localectl list-keymaps | grep -q "${1}"
then
keymap="${1}"
else
exec 3>&1
keymap=$(/sbin/dialog --title "Keyboard layout" --menu "Choose a keyboard layout" 25 50 20 $(for item in ${keymaps[@]}; do echo ${item} "-" ; done) 2>&1 1>&3) || exit 1
exec 3>&-
fi
localectl set-keymap ${keymap}
if [[ $DISPLAY ]] && [[ -r /etc/X11/xorg.conf.d/00-keyboard.conf ]]; then
# X11 is already running
x11keymap=$(awk '/^\s*Option "XkbLayout"/ { print $3 }' /etc/X11/xorg.conf.d/00-keyboard.conf)
setxkbmap -layout ${x11keymap}
fi
问题是,localectl list-keymaps
并且localectl set-keymap ${keymap}
似乎不适用于 Debian 系统。我做了一些研究,发现这是因为 Debian 没有像 Fedora 和 Arch 那样使用纯粹的解决方案来控制控制台中的键盘布局,而是使用了和解决方案systemd
的混合。systemd
sysvinit
但是,我无法找到一种方法来设置键盘映射,例如localectl set-keymap ${keymap}
运行此命令不会引发错误,但布局不会改变。我能够localectl list-keymaps
通过按照此解决方案手动添加它们来创建列表键盘映射https://unix.stackexchange.com/a/763320/610025,但恐怕它不适用于实际的布局更改命令。有 Debian 工作的解决方案吗?
Debian 设置键盘的方式是
作为根。
默认情况下,这是交互式的,但会比您的脚本提出更多问题:
由于它使用
debconf
,因此可以使用 预先设定值debconf-set-selections
,并且脚本以非交互模式 (DEBIAN_FRONTEND=noninteractive dpkg-reconfigure keyboard-configuration
) 运行以应用设置。然而,设置之间有相当多的交互,因此在不运行交互版本的情况下处理所有情况可能并不那么容易。另一种选择是直接编辑配置
/etc/default/keyboard
,然后在非交互模式下重新配置以应用设置。另请参阅
/usr/share/doc/keyboard-configuration/README.Debian
,man 5 keyboard
其中解释了如何在不重新启动的情况下应用设置:udevadm trigger --subsystem-match=input --action=change
以更新图形桌面环境;setupcon
以更新文本控制台。