>>5071 Mods bash(1) 曰く、 ~/.bash_profile 個人用の初期化ファイル。ログインシェルが実行します。 ~/.bashrc 対話シェルごとに実行される、個人用の起動ファイル。 です。 対話的シェルの定義は、同じく bash(1) 曰く 対話的なシェルとは、オプションでない引数がなく、標準入力と 標準出力がいずれも端末に接続されていて (これは isatty(3) で調べられます)、 -c オプションが指定されていない状態で起動 されたシェル、または -i オプション付きで起動されたシェル のことです。 です。 シェルスクリプトは http://x68000.q-e-d.net/~68user/unix/pickup?%A5%B7%A5%A7%A5%D0%A5%F3%A5%B0 にあるように、結果的には /bin/bash ./foo.sh などと起動されるので、 「オプションでない引数がなく」 に該当しないため、対話的シェルではありません。よって、 ~/.bashrc 対話シェルごとに実行される、個人用の起動ファイル。 は読み込まれません。 また、シェルスクリプト起動の場合はログインシェルでもないので、 ~/.bash_profile 個人用の初期化ファイル。ログインシェルが実行します。 も読み込まれません。 以上が仕様上の話です。 で、なぜそういう仕様かと言うと、シェルスクリプトが個人用の 設定を参照してしまうと都合が悪いからです。例えばこちらの手元の CentOS 5.3 において /usr/bin/* のうちシェルスクリプトである ものは、以下のようにかなりあります。 /usr/bin/apr-config /usr/bin/apropos /usr/bin/apu-config /usr/bin/at /usr/bin/atq /usr/bin/atrm /usr/bin/bashbug-32 /usr/bin/build-classpath /usr/bin/build-classpath-directory /usr/bin/build-jar-repository /usr/bin/bzcmp /usr/bin/bzdiff /usr/bin/bzgrep /usr/bin/bzless /usr/bin/bzmore /usr/bin/c89 /usr/bin/c99 (略) これらが実行されるたびに ~/.bash_profile などを呼んでしまうと、 alias・シェル変数・関数などがプログラム作成者の意図に反したもの であった場合、おかしな挙動をしてしまうでしょう。それを避けるために こういう仕様になっているものと思います。 上記のプログラムの挙動をカスタマイズしたい場合は、アプリ個別の 設定ファイル (~/.*rc) や、環境変数で指示すべき、ということですね。 > 個人的にはこのように考えるとcronからのスクリプト実行でも > 環境変数を~/.bashrcから読み込まない事にも合点がいくのですが。。。 cron 経由だと端末を持たないので対話的シェルではないから、 ~/.bashrc を読まない、です。この結果、 ログインシェル・対話的シェルと、cron 経由のシェルで 共通の環境変数を設定する方法がない となってしまい、仕様としてはイマイチだと個人的には思っていますが、 世の人達は cron で HOGE=fuga * * * * * $HOME/bin/foo.sh としたり、 * * * * * . $HOME/.bash_profile && $HOME/bin/foo.sh としたり、 $HOME/bin/foo.sh 内で必要な環境変数を設定する などの方法で乗り切っています。 環境変数であれば FreeBSD だと /etc/login.conf で設定する方法 もありますが、Mac OS X だとどうなのかはわかりません。 > 一般的な説明としてスクリプト実行には新たにシェルが起動しているという説明と > ~/.bashrcが起動しない結果が自分の中で噛み合ないので質問させて頂きました。 シェルは起動していますが、~/.bashrc などを読むべき条件が 揃っていない、ということですね。 |