シェル環境
設定を書いたのに効かない、という詰まり方の大半は、書いた場所が違うだけです。bash は起動のしかたによって読むファイルを変えます。102 試験で最も点になりやすい範囲なので、暗記ではなく仕組みで押さえます。
export しない変数は、子プロセスから見えない
シェルの中だけで有効なのがシェル変数、子プロセスにも引き継がれるのが環境変数です。変数を作った時点ではシェル変数で、export を通して初めて環境変数になります。
ターミナル
MYVAR=hello # シェル変数。この bash の中だけ
export MYVAR # 環境変数に昇格。子プロセスに引き継がれる
export MYVAR2=world # 代入と export を同時に書ける違いは子の bash を起こせば分かります。bash -c 'echo $MYVAR' は子プロセスなので、export していない変数は空で返ります。
| コマンド | 見えるもの |
|---|---|
env | 環境変数だけ。printenv も同じで、名前を1つ指定できる |
set | シェル変数と環境変数、シェル関数まで全部 |
unset VAR | 変数を消す。シェル変数でも環境変数でも消える |
export -n VAR | 環境変数からシェル変数に戻す。値は残る |
set は広く env は狭い、と覚えます。出題される変数名は HOME PATH PWD SHELL、ロケールの LANG、既定のエディタを決める EDITOR、履歴の HISTSIZE と HISTFILE です。
PATH の追記で $PATH を書き忘れると ls すら消える
PATH は、コマンド名だけを打ったときにシェルが実行ファイルを探すディレクトリの並びです。左から順に探し、最初に見つかったものを実行します。追加するときは既存の値を残します。
ターミナル
export PATH="$PATH:/opt/mytool/bin" # 末尾に足す。既存を優先
export PATH="/opt/mytool/bin:$PATH" # 先頭に足す。自分のものを優先export PATH=/opt/mytool/bin と書くと既存のパスが丸ごと消え、ls すら見つからなくなります。引っかけの定番です。カレントディレクトリの . を含めるのも、同名の偽物を踏むので避けます。
ログインシェルと非ログインシェルで読むファイルが違う
| 起動のしかた | 読むファイル (上から順) |
|---|---|
| ログインシェル | /etc/profile → /etc/profile.d/*.sh → ~/.bash_profile か ~/.bash_login か ~/.profile のいずれか1つ |
| 非ログインの対話シェル | /etc/bash.bashrc (Debian 系) → ~/.bashrc |
ログインシェルは、コンソールからログインしたときや su - bash --login で起きるシェルです。非ログインの対話シェルは、端末で新しいタブを開いたときや、ログイン後にただ bash と打ったときのシェルです。
ホーム側の3つのうち、読まれるのは最初に見つかった1つだけです。~/.bash_profile があれば ~/.profile は読まれません。ここも頻出です。多くのディストリビューションは ~/.bash_profile の中から ~/.bashrc を読ませており、こうするとログインでも非ログインでも同じ設定が効きます。終了時には、ログインシェルに限って ~/.bash_logout が読まれます。
source と bash file は効果が違う
alias はコマンドに別名を付ける機能で、定義は現在のシェル限りです。常用するなら ~/.bashrc に書きます。
ターミナル
alias la='ls -A' # 定義。alias だけなら一覧、unalias で解除
\ls # 先頭に \ を付けると alias を無視して本体を呼ぶ書き換えた設定ファイルをそのシェルにすぐ反映させるには source を使います。ドット1つも source と同じものです。
ターミナル
source ~/.bashrc
. ~/.bashrcbash ~/.bashrc と書くと子プロセスで実行されるため、変数も alias も現在のシェルには残りません。
試験で狙われるところ
export しない変数は子プロセスに見えません。PATH の追記で $PATH を書き忘れると既存のパスが消えます。ホームの3つの設定ファイルは1つしか読まれません。~/.bashrc はログインシェルでは直接には読まれず、~/.bash_profile 経由で読ませます。