Os terminais não transmitem essa informação. Você precisa chamar um utilitário externo (ou gravar um módulo zsh carregável) que seja específico para o console do Linux. Ele precisaria chamar um dos ioctl do console Linux , especificamente TIOCLINUX
para obter o estado de mudança. Os utilitários relacionados ao teclado estão no kbd
package , mas não acho que haja um que relate estados modificadores.
Você pode encontrar o código para tal utilitário em uma pergunta semelhante no Stack Overflow .
Se você não quiser confiar em um utilitário adicional, o pacote kbd inclui kbdinfo
que pode relatar o estado do LED.
# Start X if Caps Lock is on
if kbdinfo gkbled capslock; then
setleds -D -caps
exec startx
fi