3. 環境のカスタマイズ |
ここでは bash が環境をカスタマイズするために提供しているもっとも重要な特徴 「特殊ファイル」,「エイリアス」,「変数」について見ていく. | ||
<-- 「2.コマンドライン編集」へ戻る | ↑ 目次へ戻る | 「4.シェルプログラミング(1)」へ進む --> |
3.1 .bash_profile, .bash_logout, .bashrc ファイル3.2 エイリアス
3.3 シェル変数
3.4 環境変数
3.1 .bash_profile, .bash_logout, .bashrc ファイルbash をログインシェルとしているユーザがログインすると,
の順に読み込まれ,環境の設定がなされていく.
- /etc/profile
- ~/.bash_profile
- ~/.bash_login ( .bash_profile が存在しないとき)
- ~/.profile ( .bash_profile, .bash_login とも存在しないとき)
/etc/profile を一般ユーザーが書き換えることはできないので, ユーザーが環境をカスタマイズする場合は 2 番目に読み込まれる .bash_profile を編集することになる.
しかしながら,この .bash_profile ファイルはログイン時のみに読み込まれるもので,ログインした後に bash シェルを別に起動した場合 (新規に kterm を開いた場合などがそれに相当する) などは読み込まれない. その場合は,~/.bashrc ファイルが読み込まれる.
そのため通常は, ~/.bash_profile と ~/.bashrc の両方を書き換えるのではなく,~/.bash_profile の中で ~/.bashrc を読み込むようにし, カスタマイズは ~/.bashrc のみで 行うようにするとよい.
ログアウトにおいて読み込まれるファイルもある. それが ~/.bash_logout である.
このファイルの使い道としては, ログアウトのたびに自分のホーム以下に存在するかもしれない core 等の不要なファイルを削除するといったことが考えられる. ただ,必ずしもこのファイルが存在する必要はない.
- 基本的なエイリアス
エイリアスとはコマンド等の別名を定義するための機能である. 既に C シェルに親しんでいるユーザーにとってはお馴染みであろう. ただし,C シェルでのエイリアスとは若干記述の仕方が違うので注意が必要である. また,エイリアスに引数をとらせたいユーザーは後述する機能「関数」 を参考にしてもらいたい.
bash でのエイリアスの定義は
alias name=commandという書式で行う. この文はコマンドラインで入力してもよいが,その場合はその bash のみで有効なので,永続的に利用したい場合は上述した ~/.bashrc に書くとよい. これにより command と入力する代わりに name と入力してもよいようになる.例えば,ls というコマンドをついつい慌てて sl と入力しがちな人は
alias sl=lsと ~/.bashrc に書いておくといいだろう. このとき = の両端にスペースを入れてはいけない ことに注意が必要である.
- スペースを含むエイリアス
エイリアスを定義したい対象にスペースが含まれている場合は クォーテーション( ' )で括る 必要がある: 例えば,
alias mmule='mule -fn -misc-marumoji-medium-r-normal--0-0-75-75-c-0-jisx0201.1976-0'のように定義すると mmule で指定フォント(丸文字フォント)の mule が起動する. (ただし,これはローカルな設定なので一般に丸文字になるとは限らな い. また,上の定義はおそらく 2 行に別れて表示されているだろうが実際は長い 1 行である.)
- エイリアスが再帰的になる場合
私の個人的な環境下では ls コマンドは
alias ls='ls -F --color=auto'とエイリアスになっている. ここでは ls を定義するのに ls が登場しており, 一見無限ループに陥ってしまいそうであるが,bash ではその心配はない. エイリアスの展開に同一のエイリアスが再度登場する場合は展開されずそのままで処理される.
- エイリアスの定義に別のエイリアスを用いる
上で示した2つのエイリアス
alias ls='ls -F --color=auto'を考えると,2つめのエイリアス sl はまず,ls に展開される. bash はそこでさらに ls に対してエイリアス展開を試みる. 従って,2段階にわたってエイリアス展開が行われ,sl と入力してもエイリアスのかかった ls と同じ結果が得られる.
alias sl=ls
- エイリアスを無効にする
エイリアスを無効にするには以下の2つがある.
- バックスラッシュ(\)を先頭に付けて利用する.
- unallias name とする.
環境のカスタマイズを行う上でシェル変数の設定は最も重要な要素であろう. それらは
変数名=値という書式で設定する. この際,エイリアス同様,= の両側にスペースを空けてはならない.
逆に変数を削除するにはunset 変数名とする.
変数の設定内容を確認するには $ を付けて% echo $変数名または% echo "$変数名"とすればよい.なお, 変数をダブルクォーテーション( " ) でくくると変数部分はその値に展開されるが, シングルクォーテーション( ' ) で括った場合はそのままの文字列 として処理されることにも注意が必要である.
- 編集モードの変数
コマンドライン編集モードに関連するシェル変数をいくつか紹介する.
変数 説明 HISTCMD 現在のコマンドのヒストリ番号 HISTCONTROL 値に ignorespace を設定すると, スペースで始まる行はヒストリリストに追加されない. ignoredups を設定すると, 最後のヒストリ行と一致する行はヒストリリストに追加されない. ignoreboth を設定すると,両方のオプションが有効になる. HISTFILE 編集モードで操作されるヒストリファイルの名前 HISTFILESIZE ヒストリファイルに格納される行の最大数.初期値は 500 HISTSIZE コマンドヒストリとして記憶されるコマンドの最大数. 初期値は 500 HISTSIZE で設定した値が history コマンドで表示されるヒストリリストの行数になる.
もし,HISTSIZE を HISTFILESIZE よりも大きくすると, 必然的にその差の分だけヒストリリストが間引かれて $HISTFILE に格納される.
- メール変数
シェルは定期的にメールファイルを調べ, 最後に確認してから変更が加えられたかどうかを判断する. この作業について次のような変数が用意されている.
変数 説明 メールの到着を確認するためのファイルの名前 MAILCHECK どのぐらい頻繁に新しいメールを確認するかを示す (秒単位.デフォルトは 60秒) 例えば /etc/profile で
MAIL="/var/spool/mail/$USER"のように設定できる.
- プロンプト変数
bash にはプロンプトに関する変数が4つ用意されている: PS1, PS2, PS3, PS4.
しかしながら PS1 以外はあまり利用しないかもしれない.
PS1 で設定するのはプライマリプロンプトといい, 通常我々が利用しているシェル上でのプロンプトはこれに当たる. プロンプトの定義に利用できるコマンド一覧を以下に示す.
コマンド 意味 \d "曜日,月,日"の書式による日付 \h ホスト名 \n 改行 \s シェルの名前 \t HH:MM:SS 書式による時間 \u 現在のユーザー名 \w 現在の作業ディレクトリ \W 現在の作業ディレクトリのベース名 \# 現在のコマンドのコマンド番号 \! 現在のコマンドのヒストリ番号 \$ 有効な UID が 0 であれば # を,それ以外なら $ を表示 \nnn 8 進数 nnn での文字コード \\ バックスラッシュの表示 \[ 端末制御シーケンスなど,非表示記号のシーケンスの開始 \] 非表示記号シーケンスの終了 私の個人的な環境下では /etc/bashrc で
PS1="\[\033[1m\033[34m\h(\u:\w)\\$ \033[0m\]"と設定している. これを左から順に説明したものを次表に示す. 興味のある人はいろいろと試してみるとよい.
記号 解釈 \[ シーケンスの開始 \033[1m これ以降を太文字にする \033[34m これ以降を青にする \h ホスト名 ( ( \u ユーザ名 : : \w カレントディレクトリ ) ) \$ 一般ユーザーなら $ ,スーパーユーザーなら # ( 設定ファイルに書く場合は \\$ にしないと有効にならない ) \033[0m エスケープシーケンス(太文字,青)をこれ以降で無効にする \] シーケンスの終り PS2 というプロンプト変数はセカンダリプロンプトを設定するものである. セカンダリプロンプトとは,例えば, 入力されたコマンドが未完成である場合に引き続いて入力を促すために > が表示されることがあるが,そのときの > のことを指す. つまり,
$ echo "this is aとなる.
> test." <--- 文字列が未完成であるためセカンダリプロンプトが出る
$
PS3 と PS4 はシェルのプログラミングとデバックに関連するものであり, ここでは割愛する.
- コマンド検索パス
最も重要で最も基本的であろうシェル変数として PATH がある. これは言わずと知れたコマンド検索経路を示すものである. 例えば,
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/vine/binという値が PATH に設定してあった場合, プロンプト上で入力のあったコマンドはの順に探される. 従って,同じ名前のコマンドが /usr/local/bin と /bin の両方にあったとしても,プロンプト上で入力した場合は /usr/local/bin に置かれている方が実行される. /bin の方を実行したい場合は
- /usr/local/bin
- /bin
- /usr/bin
- /usr/X11R6/bin
- /usr/vine/bin
/bin/コマンド名のようにフルパスで入力する. あるコマンドについて,現在の PATH の下でどこにあるものが利用されるのかはシェルの組込みコマンド type を用いてtype コマンド名とすることで分かる.
もし,PATH にカレントディレクトリ( . )を追加するには, コロン( : )で区切ってPATH="$PATH":.とすればよい. 間違えても $PATH をシングルクォーテーションでくくってはならない (その理由は上述した.). なお,これに関しては ~/.bashrc ではなく ~/.bash_profile に 記述するべきである. なぜなら,実際 PATH は(後述する)環境変数として利用され, そのままサブシェルへと引き継がれるため,~/.bashrc に記述すると bash サブシェルの起動 (kterm から別の kterm を起動した場合など) のたびに実行されるため,同じパスが数珠つなぎに続いていってしまう.また,
PATH=.:"$PATH"と カレントディレクトリを優先するような設定はお勧めできない. なぜなら, カレントディレクトリはそれが前もってどこになるかは分からないし, ユーザのホーム以外の場所になることも十分にありうるため, 予期せぬトラブルを生じることがある.
例えば,ある意地悪な人があるディレクトリに ls という名前で悪さを働くプログラムを仕掛けていたとしよう. すると,そこに何も知らない人がたまたまそのディレクトリに移動してきて, なにげに ls を実行してしまうと,その人は罠にかかってしまうことになる.
- ディレクトリ検索パスと変数
PATH はコマンドの検索経路を指定するものであった. これと同様に,ディレクトリを検索する経路を指定 することもできる. このためのシェル変数は CDPATH である. デフォルトは何も設定されておらず, カレントディレクトリのみが対象となる.
例えば,CDPATH=:~/program/c++/dataと設定し,ここで% cd a03とすると,その検索はの順になる. つまり, まず最初にカレントディレクトリに a03 というサブディレクトリを探し, 存在すればそこに移動する. さもなくば ~/program/c++/data に a03 というサブディレクトリを探し, 存在すればそこに移動する.
- カレントディレクトリ(空文字列がこれに対応している)
- ~/program/c++/data
同様の処理を行うのにもう一つ別の方法が存在する. それは変数にディレクトリパスを格納する方法である. 例えば,~/program/c++/network/type1/data というディレクトリがあったとしよう. ここまで cd するにはなかなか手間がかかる. ここで,
data1=~/program/c++/network/type1/dataのようにこのディレクトリ名を値とするシェル変数 data1 を定義する. このままでは% cd data1としても無駄だが,cdable_vars=onという一行を前もって記述しておくと, 変数の値を cd コマンドのオペランドとして利用できるのである.
- その他の変数
上で登場しなかった変数のうち,基本的なものをいくつか紹介しておこう.
変数 意味 HOME ホームディレクトリの名前 SECONDS シェルが呼び出されてからの秒数 BASH 起動しているシェルの実行可能ファイルへのパス名 BASH_VERSION 起動しているシェルのバージョン番号 PWD カレントディレクトリ OLDPWD 直前の cd コマンドが実行される前のディレクトリ 環境変数とはいわば上で紹介したシェル変数の特別版である. シェル変数はそのままでは現在のシェル内のみで有効であり, サブシェル(新たにその子プロセスとして起動させたシェル;kterm 上で新しい kterm を起動した場合などがこれに相当する)には引き継がれない.
しかし, export というキーワードを付けてシェル変数を宣言/設定すれば, その変数は環境変数として処理され,サブシェルにも引き継がれる. 具体的には,export 変数名=値とする. なお,後者の書式の場合,複数の変数をまとめてもしくは
変数名=値
export 変数名export 変数1 変数2 ...とスペースで区切った形で処理することもできる.また,変数をある特定のサブプロセス環境のためだけに定義することもできる. その場合,
変数名=値 コマンドの形でコマンド(サブプロセス)を起動する. 例えば,kterm を現在の PATH の内容 に ~/mybin を追加した PATH で起動したい場合,PATH=$PATH:~/mybin ktermとする.