1.3. bash の環境設定

1.3.1. 環境設定ファイルの概要

bash には、シェルの起動時に読み込まれるいくつかの環境設定ファイルが存在します。これらの環境設定ファイルはシェルスクリプトで記述されており、シェルが起動する際に実行されます。環境設定ファイルでは、環境変数やコマンドのエイリアス等が設定され、各ユーザーが使用するシェルの初期化処理が行われます。

システム起動後にコンソールへ表示されるログインプロンプト(ランレベル 3 の場合)にユーザー名とパスワードを入力し、システムにログインすると、/etc/passwd で定義されたログインシェルが起動します。先に述べたように、Turbolinux 標準のログインシェルは /bin/bash です。そして、bash は最初に bash の環境設定ファイルの 1つである /etc/profile を実行します。次に、各ユーザーのホームディレクトリに存在する ~/.bash_profile を実行します。もし、~/.bash_profile が存在しなければ、~/.bash_login~/.profile の順に検索し、存在した環境設定ファイルを実行しますが、Turbolinux には、~/.bash_profile が存在しますので、ログインシェルは、/etc/profile~/bash_profile の順に 2つの環境設定ファイルを実行していることになります。

ログインシェルでない場合は、単にユーザーのホームディレクトリに存在する ~/.bashrc が実行されます。ログインシェルでないシェルとは、コマンドラインから 他の bash を直接起動した場合や X Window System で mlterm などの端末エミュレータを起動した場合のシェルです。

よって、システムにアカウントを持つ全てのユーザーに共通の環境設定は、通常、システム管理者により、/etc/profile に記述されます。それに対して、ユーザー固有の環境設定は、~/.bash_profile、もしくは ~/.bashrc へユーザー自身が必要に応じて記述することが可能です。ここで、~/.bash_profile は、ログイン時に起動されるログインシェルだけに実行される環境設定ファイルであることに注意する必要があります。ログインシェルでないシェルを起動した場合、~/.bashrc は実行されますが、~/.bash_profile は実行されません。一般的には、ログイン時に一度だけ実行したい処理は ~/.bash_profile に記述し、シェルを起動する毎に実行したい処理は ~/.bashrc に記述して使い分けます。しかし、これら 2つの環境設定ファイルの内容が異なる場合、ログインシェルとその他のシェルとの環境設定は同じものとはなりません。そこで、Turbolinux をはじめ多くのディストリビューションでは、~/.bash_profile から ~/.bashrc を読み込むことで、同じ環境設定がなされるように考慮されています。つまり、ユーザー固有の環境設定を記述したい場合は、~/.bashrc へ追記すれば、ログインシェルへも反映されるようになります。

1.3.2. /etc/profile

Turbolinux の /etc/profile の例を示します。プロダクトのバージョンによっては、多少内容が異なる場合がありますが、基本的な役割は同じです。/etc/profile は、全てのユーザーに共通の環境設定が記述されており、ログイン時に読み込まれます。行頭の行番号は、実際には存在しません。また # で始まる行は、コメントと見なされます。

# /etc/profile

# System wide environment and startup programs
# Functions and aliases go in /etc/bashrc

PATH="$PATH:/usr/X11R6/bin"

# Load system default language.
if [ -f /etc/sysconfig/lang ] ; then
   LANG=`cat /etc/sysconfig/lang`
   export LANG
fi

ulimit -c 1000000
umask 022

USER=`id -un`
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"

HOSTNAME=`/bin/hostname`
HISTSIZE=1000
HISTFILESIZE=1000
LESSOPEN="|/usr/bin/lesspipe.sh %s"
export PATH HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL LESSOPEN
export LESS=-X
export HISTCONTROL=ignoredups

if [ ! "$BASH" = "" ]; then
        PS1="[\u@\h \W]\\$ "
        export PS1
        shopt -s cdspell
fi

for i in /etc/profile.d/*.sh ; do
        if [ -x $i ]; then
                . $i
        fi
done
unset i

/etc/profile で行われている主な処理について解説します。

PATH の追加

環境変数 PATH/usr/X11R6/bin を追加します。/usr/X11R6/bin は X アプリケーションのバイナリファイルが格納されるディレクトリです。

ロケールの設定

システムのデフォルト言語を定義するための処理が行われますが、/etc/sysconfig/lang は存在しません。現在の Turbolinux では、~/.lang ディレクトリ内のファイルでロケールの設定が行われています。

core ファイルの出力サイズ

core ファイルの出力サイズの上限を制限します。core ファイルとは、プログラムが異常終了した際に生成されるメモリの状態を保存したファイルで、障害の原因究明のために利用されます。ulimit コマンドを使用すると、core ファイルの出力サイズを制限することができます。

umask の設定

umask のデフォルト値を 022 へ設定しています。umask とは、ファイルやディレクトリを作成した際に設定されるデフォルトのパーミッションに対するマスク値を指定するためのものです。つまり、umask の値が 022 に設定された場合、ディレクトリ作成時のパーミッションは、755(rwxr-xr-x)、ファイル作成時のパーミッションは 644(rw-r--r--)がデフォルトとなります。

その他の設定ファイルを実行

/etc/profile.d ディレクトリに格納されている 拡張子 .sh のスクリプトを読み込み実行します。これらのスクリプトは、ある特定のプログラムやアプリケーションのための環境変数などを設定するために用意されていることがあります。

1.3.3. .bash_profile と .bashrc

Turbolinux の ~/.bash_profile の例を示します。プロダクトによっては、多少内容が異なる場合がありますが、基本的な役割は同じです。

#
#       login setting for bash
#                                    (C)2000,2001 TurboLinuxJ
#

if [ -f ~/.bashrc ]; then
        source ~/.bashrc
fi

# User specific environment and startup programs

ENV=$HOME/.bashrc
USERNAME=""

export USERNAME ENV PATH

ホームディレクトリに .bashrc が存在した場合は、source コマンドで読み込みます。これにより、ログインシェルであっても ~/.bashrc が実行されます。

source コマンドは、現在のシェルでコマンドを実行するために使用されます。通常、シェルスクリプトからコマンドや他のシェルスクリプトを実行すると新しいシェル(サブシェル)が起動され、新しく起動されたサブシェルでコマンドが実行されます。そして実行後は、サブシェルは破棄され、元のシェルへ戻ります。しかし、source コマンドや . コマンド(source コマンドと同様の働きをします)を使用すると、コマンドや他のシェルスクリプトを呼び出したシェルと同じシェルでコマンドを実行することができます。つまり、シェルスクリプトから呼び出した他のシェルスクリプトで環境変数の設定などを行っても、サブシェルが終了してしまえば、設定した環境変数は失われてしまいます。しかし、source コマンドを使用すれば、現在のシェルでコマンドを実行するため、現在の環境設定を変更することができます。

次に、Turbolinux の ~/.bashrc の例を示します。プロダクトによっては、多少内容が異なる場合がありますが、基本的な役割は同じです。

#
#        initial bashrc
#                              by GO!
#
[ "$BASH" = "" ] &&  return
# source system wide aliases
if [ -f /etc/bashrc ]; then
    source /etc/bashrc
fi

if [ -f ~/.lang/langrc.sh ]; then
    source ~/.lang/langrc.sh
elif [ -f /etc/sysconfig/lang ] ; then
   LANG=`cat /etc/sysconfig/lang` ; export LANG
fi

case `tty` in
    'not a tty')
    ;;
    *)
    [ "$(stty | grep erase)" = "" ] && \
    stty erase '
    ;;
esac

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias ..='cd ..'
alias ll='ls -l'
alias la='ls -aF'

alias ls='ls -NF --show-control-chars'
## if you use color ls, comment out above line and uncomment below 2 lines.
# LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;3
3;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=
01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.i386.
rpm=01;31:*.src.rpm=01;30:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.ppm=01;35:*.tga=
01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.png=01;35:' ; export LS_COLORS
# alias ls='ls --color=auto -NF --show-control-chars'

~/.bashrc で行われている主な処理について解説します。

プロンプトの表示

/etc/bashrc ファイルが存在した場合に読み込み、実行します。/etc/bashrc ファイルでは、プロンプトの表示形式を設定するための環境変数 PS1 の設定を行っています。

ロケールの設定

~/.lang/langrc.sh を実行し、システムのデフォルト言語の設定を行います。また、多言語対応された rxvt などの端末エミュレータは、環境変数 LANG に応じて読み込まれるリソースファイルが自動的に切り替わります。これにより、各言語に適した環境で端末エミュレータが起動されます。リソースファイルは、/usr/X11R6/lib/X11/$LANG/app-defaults/ ディレクトリに配置されています。

エイリアスの設定

コマンドのエイリアスを設定します。エイリアスとは、コマンドに別名を付けることを言います。よく使用するコマンドやオプションの指定が複雑なコマンドにエイリアスを設定すると、設定したエイリアス名でコマンドが実行できるようになります。Turbolinux では事前にいくつかのエイリアスを ~/.bashrc ファイルで定義しています。例えば、cp コマンドを実行したときは、必ず -i オプションが指定されるようにエイリアスが設定されています。これにより、コピー先に同名のファイルが存在する場合は、必ず上書きするかどうかの問い合わせを行います。ユーザー自身がコマンドのエイリアスを定義したい場合は、 このように ~/.bashrc へ追記することが可能です。また、ls コマンドのエイリアスをコメントアウト(行頭に # を記述)し、その後に続く 2行のコメント記号(# LS_COLORS= と # alias ls= の #)を外すことで ls コマンドの出力結果をカラー表示に変更することができます。