ldd $(type -p xmodmap) mostra que xmodmap usa libX11.so.6 para se comunicar com o servidor X. Portanto, não é possível usar xmodmap antes de o servidor X estar em execução.
$ ldd $(type -p xmodmap)
linux-vdso.so.1 => (0x00007ffc5c1f3000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f8abffa6000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8abfbe1000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f8abf9c2000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8abf7be000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8ac02db000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f8abf5ba000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f8abf3b4000)
No meu Ubuntu 14.04.5, (YMMV), usando pgrep X e ps -fp$(pgrep X) e seguindo o campo PPID de volta, vejo:
$ ps -fp1851,1801,1603
UID PID PPID C STIME TTY TIME CMD
root 1603 1 0 Jul27 ? 00:00:00 gdm
root 1801 1603 0 Jul27 ? 00:00:00 /usr/lib/gdm/gdm-simple-slave --display-id /org/gnome/DisplayManager/Displays/_0
root 1851 1801 1 Jul27 tty7 04:30:37 /usr/bin/X :0 -background none -verbose -logverbose 7 -core -auth /var/run/gdm/auth-for-gdm-ZKZ4jH/database -seat seat0 -nolisten t
O que me diz que o servidor X ( X ), PID 1851 (no meu sistema, neste momento, YMMV) foi iniciado pelo PID 1801 ( /usr/lib/gdm/gdm-simple-slave ), que, por sua vez, foi iniciado pelo PID 1603 (%código%).
gdm inicia somente gdm (que inicia gdm-simple-slave ) DEPOIS de você fazer login, isso não funcionará antes do login.
Executando X antes de xmodmap ser iniciado, ou sem colocar X em seu script antes do export DISPLAY=:0 , E ter feito xmodmap em sua sessão X.
Resposta reformulada:
Leia man xhost;xhost +local: .
Depois de ter logado, abra uma janela de terminal e olhe:
$ echo $DISPLAY
:0
Permitir que os processos em execução neste sistema, mas NÃO em execução no processo man xhost server, comuniquem-se com o processo X server:
$ xhost +local:
non-network local connections being added to access control list
Isso durará até que você o altere de volta ( X ) OU até que o servidor xhost -local: seja encerrado, portanto, se isso funcionar para você, coloque-o na inicialização de seu usuário em algum lugar.
Enquanto X estiver em vigor, você poderá executar seu xhost +locakl: em qualquer contexto (por exemplo, de xmodmap ) fazendo:
env DISPLAY=:0 xmodmap ....
ou, se você quiser usar vários comandos /etc/pm/power.d/ ,
export DISPLAY=:0
xmodmap ...
xmodmap ...
Observação: Permitir conexões com o seu servidor xmodmap por "conexões locais que não são de rede" torna seu sistema menos seguro.