はじめまして、Mod's(マスター・オブ・ドヘン○イ)と申します。 困った時に参考にさせて頂いております。 Bシェルスクリプトを独学中です。と言いつつBashの環境設定ファイルとサブシェル (詰まる所はプロセスの理解不足)について質問させてください。 利用環境:MacOSX 10.6 ログインシェル:Bash bash-3.2$ bash --version GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0) 元々はログインシェルがBashの利用環境にてログイン過程のシェル起動や以降のシェル起動による 環境設定ファイルの読み込み順序などを調べる為に/etc/profile、/etc/bashrc、~/.bash_profile、 ~/.bashrcの4つにそれぞれechoコマンドを仕込んで実際にそれらログインスクリプトが起動した 時に任意のファイルへ「読み込みました」的な内容の出力をするようにしました。 結果、ログイン時にはそれら全ての環境設定から出力されその後のBashの起動では~/.bashrcから のみ出力があり、ここまでは予想通りでした。 グローバル環境設定ファイル、およびローカル環境設定ファイルのいずれもprofile側からrc側を sourceしています。 ここまでは良いのですが、カレントシェルからシェルスクリプトを実行した際、私の予想では ~/.bashrcから出力を得られるつもりでいました。シェルスクリプトを実行する際にサブシェルを 起動すると「されている(←私の中で未確定)」わけですから。 従いまして下記のように2つ推測を立ててみました(どちらも外れているかもしれませんが:笑)。 <推測> 推測① :新たにシェルは起動している、しかし。 スクリプト実行によるサブシェルはあくまでスクリプトを実行するシェルであって対話シェル として起動しているわけではないのでローカル環境設定ファイルを読み込む必要がない。 言い換えると環境設定ファイルはあくまでログインスクリプトだから。 推測② :新たにシェルは起動していない。 あくまでスクリプトを解釈するのはカレントシェルであって解釈後の実際の処理はシェルの 起動を伴わない子プロセスが実行するから。 推測②を書いていてふと思ったのですが、1つのプロセスというのは同時に一つの事しか出来ない 「はず」で、カーネル視点から考えるとシェルとしてプロセスを起動した以上は入力されたコマンド を自身が理解出来る命令へ翻訳して受け取るための1プロセス。 そして翻訳された命令を受け取ったカーネルは実際のデータ処理実行でまた次の1プロセスを育成。 つまり、こちらはカーネル上のデータ処理のプロセスであってシェルの起動ではない。 よってカレントシェルからのスクリプト実行の処理というのはカレントシェルがスクリプト内の コマンドを翻訳してカーネルが翻訳された命令を受け取って子プロセスが育生されるので~/.bashrcは 読み込まれない。 つまり、「サブシェルが起動する」というのはカレントシェルのプロセス上でデータ処理が行われる 訳ではないということを便宜的に説明するための「考え方」でしかないのか? と、以上までのような推測を立ててみました。 個人的にはこのように考えるとcronからのスクリプト実行でも環境変数を~/.bashrcから読み込ま ない事にも合点がいくのですが。。。 もっともcronプロセスはログインプロセスとは全くべつのプロセスなので環境変数で引き継ぐも なにもないのですがシェルが起動するということを中心に考えると、むぅ〜ん、という感じです。 どちらにせよ、~/.bashrcをシェルスクリプト実行時に起動させたければsourceすれば良いだけの ことですが、一般的な説明としてスクリプト実行には新たにシェルが起動しているという説明と ~/.bashrcが起動しない結果が自分の中で噛み合ないので質問させて頂きました。 psコマンドを使いこなせていれば良いのだろうなぁと思いつつ。いきなりの長文で失礼しました。 http://x68000.q-e-d.net/~68user/unix/pickup?keyword=%A5%B5%A5%D6%A5%B7%A5%A7%A5%EB&target=command |