ごく基本的なことだが、今までよく考えずに使っていた。
source
コマンドというと、「.bash_profile
を変更した後に使うもの」ぐらいのイメージしかなかった。
謎
「なぜひと手間かけさせるのか」「プロフィールファイルを変更した時に、環境設定も自動更新してくれたら良いのに」と思っていた。
だが source
コマンドは実は、環境をリロードするためのものではない。
ファイルに書かれた内容を 忠実にコマンドとして実行していくものなのだ。
$ source
と $ bash
の違い
では $ bash
でファイルを実行するのとは何が違うのか。
-
$ bash [file]
はシェルスクリプト内の 「裏側=閉じられた環境」 でコマンドを実行する。 -
$ source [file]
は 「表側=開いた環境」 で、コマンドを実行する。
動作が変わる例
たとえば「変数に代入するだけ」の単純なスクリプトがある場合。
DO_YOU_UNDERSTAND='YES! YES! YES!'
bash
これを bash で実行しても、シェル自体の変数は変わらない。(環境は閉じられている)
$ DO_YOU_UNDERSTAND='NO!' # シェルに変数をセット
$ bash set_variable # 変数を変えるスクリプトを実行
$ echo $DO_YOU_UNDERSTAND # 変数を出力
NO! # 変わらない
source
だが source で実行すると、元のシェルの変数まで書き換わっているのが分かる。
$ DO_YOU_UNDERSTAND='NO!' # シェルに変数をセット
$ source set_variable # 変数を変えるスクリプトを実行
$ echo $DO_YOU_UNDERSTAND # 変数を出力
YES! YES! YES! # 変わる
動作が変わらない例
たとえばこういうファイルがあるときは。
echo 'abc'
どちらも同じように echo される。
$ bash just_echo
abc
$ source just_echo
abc
以上
しかし、なぜ source なんて名前が付いているんだろう。本当に分かりづらい。
(source=源という名前は動きではなく、目的を表しているような気がする)
これが例えば run
とかいう名前であれば、きっと多くの人が救われただろうに。
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。