~/.xinitrc と ~/.xsession は、X Window System の起動時に実行されるシェルスクリプトです。bash の環境設定ファイルとは直接関係ありませんが、システムログイン時に実行されるシェルスクリプトという点にフォーカスし、これらのスクリプトについても簡単に解説します。
X Window System の起動には、テキストログイン後に startx コマンドを実行して起動する方法とグラフィカルログインによる起動があります。そして、これらのログイン方法により、実行されるスクリプトも異なります。
テキストログイン後に startx コマンドで X Window System を起動した場合は、~/.xinitrc が実行されます。.xinitrc ファイルがホームディレクトリに存在しない場合は、システム共通の環境設定ファイルである /etc/X11/xinit/xinitrc が実行されます。ユーザー固有の設定を記述する場合は、/etc/X11/xinit/xinitrc を ~/.xinitrc としてコピーする必要があります。なお、ウィンドウマネージャ設定ツールである turbowmcfg を使用された場合は、自動的にコピーされています。
一方、グラフィカルログインの場合は、各ユーザーのホームディレクトリに存在する .xsession が実行されます。以下に Turbolinux の ~/.xsession の例を示します。
#!/bin/sh
if [ -f "/etc/profile" ]; then
. /etc/profile
fi
if [ -f "$HOME/.bash_profile" ]; then
. $HOME/.bash_profile
fi
if [ -f "$HOME/.xinitrc" ]; then
. $HOME/.xinitrc
else
if [ -f "/etc/X11/xinit/xinitrc" ]; then
. /etc/X11/xinit/xinitrc
fi
fi |
このように、グラフィカルログインの場合は最初に ~/.xsession から /etc/profile と ~/.bash_profile を読み込み、bash の環境設定を行っています。そして、最後に X Window System の環境設定ファイルである ~/.xinitrc、存在しないときには /etc/X11/xinit/xinitrc を実行します。したがって、テキストログイン、グラフィカルログインどちらの場合でも X Window System 起動時に行われる主な環境設定は、~/.xinitrc または、/etc/X11/xinit/xinitrc に記述されていることになります。
Turbolinux の ~/.xinitrc の例を示します。プロダクトのバージョンによっては、多少内容が異なる場合がありますが、基本的な役割は同じです。
#!/bin/sh
# (c)2001-2004 TurboLinux by GO!
# Please do not modify this file by hand.
# default xinitrc
userresources=$HOME/.Xresources
usermodmap=$HOME/.Xmodmap
sysresources=/etc/X11/xinit/Xresources
sysmodmap=/etc/X11/xinit/Xmodmap
if [ x"$XAUTHORITY" = x ]; then
XAUTHORITY=$HOME/.Xauthority
export XAUTHORITY
fi
# merge in defaults and keymaps
if [ -f $sysresources ]; then
xrdb -merge $sysresources
fi
if [ -f $sysmodmap ]; then
xmodmap $sysmodmap
fi
if [ -f $userresources ]; then
xrdb -merge $userresources
fi
if [ -f $usermodmap ]; then
xmodmap $usermodmap
fi
# setup Open Window env.
if [ -d /usr/openwin ] ; then
OPENWINHOME=/usr/openwin
export OPENWINHOME
fi
if [ -f ~/.lang/langrc.sh ]; then
. ~/.lang/langrc.sh set
elif [ -f /etc/sysconfig/lang ] ; then
export LANG=`cat /etc/sysconfig/lang`
# export LANGUAGE=$LANG
fi
if [ -f ~/.xim ]; then
. ~/.xim
elif [ "${LANG%%.*}" = "ja_JP" ]; then
if [ -f /var/lock/subsys/atokx2 -a -f /var/lock/subsys/IIim ] &&
[ -x /opt/atokx2/bin/atokx2_client.sh ]; then
. /opt/atokx2/bin/atokx2_client.sh
elif [ -f /var/lock/subsys/atokx -a -f /var/lock/subsys/IIim ] &&
[ -x /usr/lib/im/locale/ja/atokserver/atokx_client ]; then
. /usr/lib/im/locale/ja/atokserver/atokx_client
elif [ -f /var/lock/subsys/wnn7 ] &&
[ -x /usr/X11R6/bin/xwnmo ]; then
export XMODIFIERS="@im=_XWNMO"
/usr/X11R6/bin/xwnmo -g 1x1-0-50
elif [ -f /var/lock/subsys/atok12x ]; then
/usr/X11R6/bin/kinput2x -atok -server localhost &
alias kinput2=kinput2x
export XMODIFIERS="@im=kinput2"
elif [ -f /var/lock/subsys/wnn6 ] &&
[ -f /usr/local/OMRONWnn6/Wnn6linux/xwnmo ]; then
export XMODIFIERS="@im=_XWNMO"
/usr/local/OMRONWnn6/Wnn6linux/xwnmo -g 1x1-0-50
elif [ -f /var/lock/subsys/jserver.wnn6 ] ||
[ -f /var/lock/subsys/jserver ] ||
[ -f /var/lock/subsys/wnn6 ]; then
/usr/X11R6/bin/kinput2 -wnn -jserver localhost &
export XMODIFIERS="@im=kinput2"
elif [ -f /var/lock/subsys/canna -a -f /var/lock/subsys/IIim ]; then
export XMODIFIERS="@im=htt"
HTT_GENERATES_KANAKEY=t HTT_USES_LINUX_XKEYSYM=t HTT_DISABLE_STATUS_WINDOW=t /usr/lib/im
/httx -if canna &
elif [ -f /var/lock/subsys/canna -a -x /usr/X11R6/bin/kinput2 ]; then
/usr/X11R6/bin/kinput2 -canna &
export XMODIFIERS="@im=kinput2"
fi
elif [ "${LANG%%.*}" = "zh_CN" ] ; then
if [ -x /usr/bin/scim ]; then
/usr/bin/scim -d
export XMODIFIERS="@im=SCIM"
fi
elif [ "${LANG%%.*}" = "zh_TW" ] ; then
if [ -x /usr/bin/xcin ] ; then
/usr/bin/xcin &
export XMODIFIERS="@im=xcin"
fi
elif [ "${LANG%%.*}" = "ko_KR" ]; then
if [ -x /usr/bin/ami_auto ]; then
/usr/bin/ami_auto &
export XMODIFIERS="@im=Ami"
fi
fi
# for Qt applications
if [ "${LANG%%.*}" = "ja_JP" ]; then
UNICODEMAP_JP='cp932,nec-vdc'
export UNICODEMAP_JP
fi
# run startup scripts
for apps in /etc/X11/xinit/xinitrc.d/*
do
if [ -x "$apps" ]; then
. "$apps"
fi
done
#START_STARTUP_APPS
#END_STARTUP_APPS
#START_BACKGROUND
#END_BACKGROUND
if [ -f /etc/X11/xdm/xdmreinit ]; then
. /etc/X11/xdm/xdmreinit
fi
#START_WINDOWMANAGER
/usr/bin/startkde
#END_WINDOWMANAGER |
~/.xinitrc で行われている主な処理について解説します。
X アプリケーションの多くは、アプリケーションの動作や外観を定義するリソースと呼ばれる設定値を持っています。リソースは、リソースファイルと呼ばれる /etc/X11/xinit/Xresources や ~/.Xresources に定義されます。設定可能なリソースは、各アプリケーションの man ページなどで確認することができます。~/.xinitrc は、これらのリソースファイルが存在した場合に読み込み、リソースデータベースにリソースを保持します。/etc/X11/xinit/Xresources がシステム共通のリソースファイルであるのに対し、~/.Xresources はユーザー自身が自由に編集することができます。~/.Xresources で定義されたリソースは、/etc/X11/xinit/Xresources のリソースを上書きします。しかし、これらのリソースファイルはデフォルトで存在しませんので、必要であればユーザーが自分自身で用意する必要があります。Turbolinux には、これらのリソースファイルとは別に ~/.Xdefaults という別のリソースファイルが存在します。書式は、先に述べたリソースファイルと同じですが、~/.Xdefaults は、X アプリケーションが起動される毎に読み込まれるため、変更したリソースは、次の X アプリケーション起動時から反映されます。なお、X Window System 起動時に、/etc/X11/xinit/Xresources や ~/.Xresources が存在し、これらのリソースファイルがすでに読み込まれていた場合、~/.Xdefault のリソースは無視されます。
X Window System には、キーボードの配列を設定する 2つのメカニズムが存在します。1つは、Xmodmap と呼ばれる従来から存在する古いメカニズムです。新しいものは Xkb 拡張と呼ばれ、Turbolinux では Xkb 拡張が有効とされています。Xkb 拡張によるキーボードの設定は、X Window System の設定ファイルである /etc/X11/XF86Config で定義されています。~/.xinitrc は、Xmodmap が使用するデフォルトのキーマップファイル(/etc/X11/xinit/Xmodmap や ~/.Xmodmap)が存在した場合に読み込みますが、/etc/X11/xinit/Xmodmap は存在するものの内容は全てコメントアウトされています。
~/.lang/langrc.sh を実行し、X Window System のデフォルト言語の設定を行います。
X Window System で日本語を入力するには、かな漢字変換サーバーと入力サーバーと呼ばれる 2つのサーバーを起動する必要があります。かな漢字変換サーバーを起動するには、ランレベル毎のサービス起動設定を行う必要がありますが、入力サーバーは、~/.xinitrc により自動的に起動されます。~/.xinitrc は、環境変数 LANG を参照し、各言語の入力サーバーを起動します。日本語の入力サーバーには、ATOK X の atokx_client や Canna の kinput2 など複数存在しますが、起動しているかな漢字変換サーバーをスクリプト順に確認し、それに対応した入力サーバーを起動します。
~/.xinitrc の最後では、ウィンドウマネージャを起動します。この例では、KDE を起動しています。ウィンドウマネージャは、フォアグラウンドで起動する必要があるため & は指定しません。なお、ウィンドウマネージャ設定ツールである turbowmcfg は、選択したウィンドウマネージャを起動するために、この行を書き換えます。