今回は、Xwindow Systemの起動時に実行されるスクリプト.xinitrcの書式についてまとめました。
組み込みLinuxや自分でLinuxOSのデスクトップ環境を変えたい時に、xinitrcに起動したいコマンドやアプリケーションを記述して置くと自動実行される便利なスクリプトです。
.xinitrcとは
XWindow Systemを起動時に読み込まれるシェルスクリプトです。
~/.xinitrcは、xinitやstartxコマンドで実行時に読み込まれるシェルスクリプトです。
XWindow SystemはLinuxのデスクトップ環境を構築する上で欠かせないものです。
組み込みLinuxで、目的に合わせたXWindow環境を構築したいという時に、必要となるスクリプトがxinitrです。
~/.xinitrcカスタマイズ
~/.xinitrc カスタマイズ例1:ウィンドウマネージャーXfce4を起動
1 |
exec startxfce4 |
~/.xinitrc カスタマイズ例2:ウィンドウマネージャーXfce4とアプリケーションを起動
1 2 |
./Application & exec startxfce4 |
~/.xinitrcの記述の注意点
ここで上記の例2で注意点があります。
以下のように例2のスクリプトを修正すると動きません。
1 2 |
./Application exec startfce4 |
上記の例だと、Applicationが終了するまで、2行目のウィンドウマネージャーが起動しません。
ここはシェルスクリプト同様で、上から順に実行されるので、同時実行したい場合は、1行目をバックグランド(末尾に” &”をつける)で実行しましょう。
また、以下の例は、全てのコマンドをバックグラウンドで実行すると、Xserverが起動しないので注意しましょう。
1 2 |
./Application & exec startfce4 & |
~/.xinitrcがないときの対処法
おそらくLinuxをセットアップや、XWindow Systemをインストールしたばかりだと、~/.xinitrcスクリプトがないときがあります。
スクリプトがない場合、以下のディレクトリにデフォルトのxinitrcスクリプトがあります。
/etc/X11/xinit/xinitrc
カスタマイズしたいときは、スクリプトをコピーして使用しましょう。
1 2 3 |
sudo cp /etc/X11/xinit/xinitrc ~/.xinitrc sudo chmod +w ~/.xinitrc vim.tiny ~/.xinitrc |
またxinitrcスクリプトの代わりにXsessionを使用するディストリビューションもあります。
以下のファイルパスはLinuxMintの例です。
/etc/X11/Xsession
xinitrcスクリプトみたいに、Xsession内にカスタマイズしたいコマンドやアプリケーションを記述しましょう。
一応、LinuxMintの/etc/X11/Xseesionの内容を記述しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
#!/bin/sh # # /etc/X11/Xsession # # global Xsession file -- used by display managers and xinit (startx) # $Id: Xsession 967 2005-12-27 07:20:55Z dnusinow $ set -e PROGNAME=Xsession message () { # pretty-print messages of arbitrary length; use xmessage if it # is available and $DISPLAY is set MESSAGE="$PROGNAME: $*" echo "$MESSAGE" | fold -s -w ${COLUMNS:-80} >&2 if [ -n "$DISPLAY" ] && which xmessage > /dev/null 2>&1; then echo "$MESSAGE" | fold -s -w ${COLUMNS:-80} | xmessage -center -file - fi } message_nonl () { # pretty-print messages of arbitrary length (no trailing newline); use # xmessage if it is available and $DISPLAY is set MESSAGE="$PROGNAME: $*" echo -n "$MESSAGE" | fold -s -w ${COLUMNS:-80} >&2; if [ -n "$DISPLAY" ] && which xmessage > /dev/null 2>&1; then echo -n "$MESSAGE" | fold -s -w ${COLUMNS:-80} | xmessage -center -file - fi } errormsg () { # exit script with error message "$*" exit 1 } internal_errormsg () { # exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message # One big call to message() for the sake of xmessage; if we had two then # the user would have dismissed the error we want reported before seeing the # request to report it. errormsg "$*" \ "Please report the installed version of the \"x11-common\"" \ "package and the complete text of this error message to" \ "<debian-x@lists.debian.org>." } # initialize variables for use by all session scripts OPTIONFILE=/etc/X11/Xsession.options SYSRESOURCES=/etc/X11/Xresources USRRESOURCES=$HOME/.Xresources SYSSESSIONDIR=/etc/X11/Xsession.d USERXSESSION=$HOME/.xsession USERXSESSIONRC=$HOME/.xsessionrc ALTUSERXSESSION=$HOME/.Xsession ERRFILE=$HOME/.xsession-errors # attempt to create an error file; abort if we cannot if (umask 077 && touch "$ERRFILE") 2> /dev/null && [ -w "$ERRFILE" ] && [ ! -L "$ERRFILE" ]; then chmod 600 "$ERRFILE" elif ERRFILE=$(tempfile 2> /dev/null); then if ! ln -sf "$ERRFILE" "${TMPDIR:=/tmp}/xsession-$USER"; then message "warning: unable to symlink \"$TMPDIR/xsession-$USER\" to" \ "\"$ERRFILE\"; look for session log/errors in" \ "\"$TMPDIR/xsession-$USER\"." fi else errormsg "unable to create X session log/error file; aborting." fi # truncate ERRFILE if it is too big to avoid disk usage DoS if [ "`stat -c%s \"$ERRFILE\"`" -gt 500000 ]; then T=`mktemp -p "$HOME"` tail -c 500000 "$ERRFILE" > "$T" && mv -f "$T" "$ERRFILE" || rm -f "$T" fi exec >>"$ERRFILE" 2>&1 echo "$PROGNAME: X session started for $LOGNAME at $(date)" # sanity check; is our session script directory present? if [ ! -d "$SYSSESSIONDIR" ]; then errormsg "no \"$SYSSESSIONDIR\" directory found; aborting." fi # Attempt to create a file of non-zero length in /tmp; a full filesystem can # cause mysterious X session failures. We do not use touch, :, or test -w # because they won't actually create a file with contents. We also let standard # error from tempfile and echo go to the error file to aid the user in # determining what went wrong. WRITE_TEST=$(tempfile) if ! echo "*" >>"$WRITE_TEST"; then message "warning: unable to write to ${WRITE_TEST%/*}; X session may exit" \ "with an error" fi rm -f "$WRITE_TEST" # use run-parts to source every file in the session directory; we source # instead of executing so that the variables and functions defined above # are available to the scripts, and so that they can pass variables to each # other SESSIONFILES=$(run-parts --list $SYSSESSIONDIR) if [ -n "$SESSIONFILES" ]; then set +e for SESSIONFILE in $SESSIONFILES; do . $SESSIONFILE done set -e fi exit 0 # vim:set ai et sts=2 sw=2 tw=80: |
まとめ
また追加で情報があれば、随時追加していきたいと思います。
コメント