ファイヤープロジェクト
スクリプトの実行と環境
2003-07-20T15:13+09:00   matsu
スクリプトが実行される際の環境について.
ユーザがシステムにログインすると,普通は/bin/shというプログラムが起動する.そしてそのプログラムのコマンドプロンプトを通して人がシステムと対話する.ユーザはこのコマンドプロンプトからいくつかのコマンドを実行していくが,それらのプロセスは最初のshプロセスの子プロセスということになる.だから,shのコマンドプロンプトから実行したスクリプトもshの子プロセスとしてのshプロセスなのだ.スクリプトを起動するshプロセスとスクリプト自身であるshプロセスが別なので,当然環境が異なる.
ここでいう環境とは,以下のものを指す.
  • bashのオプション
  • パラメータ,変数とその値
  • 定義されている関数
普通,コマンドはshから実行する.が,そのsh自身もプログラムである.shの一つであるbashにはいくつかのオプションがある.それらのオプションはman等に書いてあるので,ここでは,スクリプトのデバッグに役立ちそうなものを紹介する.
-n
構文チェックだけを行い,コマンドは実行しない.
-v
実行前にコマンドを表示する.
-x
コマンドラインで処理した後にコマンドを表示する.-vは変数などを展開せずに表示するのに対し,-xは展開してから表示する.
これらのオプションをスクリプトで使用するには,以下のスクリプトの先頭の行を以下のようにする.
#!/bin/bash option
optionの部分に-nとか-vとか書く.
先述のように,プロセスが違えば,環境はことなる.例えば以下のように実行した場合,二回目と四回目ののechoでは空文字列が出力される.変数a,bの値が引き渡されないからである.
a=hoge
echo $a
bash
echo $a
b=fuga
echo $b
exit
echo $b
あるスクリプトから別のスクリプトを呼び出し,呼び出されたスクリプト内で変数や関数の定義をしても呼び出し元には反映されない.だが,時には変数や関数の定義を別のスクリプトファイルで行いたい.そういう時には,スクリプトを現在のshで実行する方法がある.それがsourceコマンドと.コマンド(両者は同じもの)である.これらは.bashrcの変更を反映させる場合によく使用される.
source .bashrc
sourceコマンドを使用した場合,.bashrcに記述されている各コマンドは,現在のshで実行される.だから.bashrcの変更が無事現在のshに反映されるのである.sourceコマンドを使用しなければ,.bashrcの変更は反映されない(ログインしなおせば反映されるが).
(以下の文章は"スクリプト"を"プロセス"と書いた方が正確かもしれない)sourceコマンドはイメージ的には子スクリプトの環境定義を親プロセスに渡すものであった(実際は子スクリプトのプロセスは作成されず子スクリプトが実行するコマンドを親スクリプトが実行する).逆に親スクリプトの環境を子プロセスに変数の定義を引き渡すにはexportコマンドを使用する.
a=hoge
export b=fuga
echo $a $b
bash
echo $a $b
一回目のechoではhoge fugaと出力されるが,二回目のechoではexportされた変数bの値であるfugaしか出力されない.
bashのオプションを先述したが,例えばスクリプト中のある部分だけデバッグしたくなった場合,オプションと同様の実行制御を途中で切替えられると便利である.これにはsetコマンドを使用する.以下にsetコマンドのオプションを示す.
-nまたは-o noexec
sh -nと同様
-vまたは-o verbose
sh -vと同様
-xまたは-o xtrace
sh -xと同様
-uまたは-o nounset
未定義変数を参照した場合にエラー出力する.
これらは以下のように使用する.
set option
optionに-nや-o noexecが入る.また,上記のオプションをオフにしたい場合は,-を+にする(例えば-nをオフにするには+n).
setコマンドは前節のオプションを評価したあと,まだパラメータが残っていれば,それらを順に$1,$2,$3...に設定して行く.これによってshのパラメータ変数を変更することができる.
shiftコマンドは$1,$2,$3....にそれぞれ$2,$3,$4....を設定する($0はかわらない).これに伴い$@や$*も変化する.これは全パラメータを順に処理するのに便利である.
今までは環境の設定や反映について述べたが,環境を削除したい場合もある.それにはunsetコマンドを使用する.
unset functionname
unset valuename
例のようにして関数や変数を環境から削除する.ただし,HOMEなどの環境変数は削除できない.
matsu(C)
Since 2002
Mail to matsu