Edited at

Linux — source コマンドは何をしているのか > 実は環境をリロードするためのものではない

More than 1 year has passed since last update.

ごく基本的なことだが、今までよく考えずに使っていた。

source コマンドというと、「.bash_profile を変更した後に使うもの」ぐらいのイメージしかなかった。


「なぜひと手間かけさせるのか」「プロフィールファイルを変更した時に、環境設定も自動更新してくれたら良いのに」と思っていた。

だが source コマンドは実は、環境をリロードするためのものではない。

ファイルに書かれた内容を 忠実にコマンドとして実行していくものなのだ。


$ source$ bash の違い

では $ bash でファイルを実行するのとは何が違うのか。



  • $ bash [file] はシェルスクリプト内の「裏側=閉じられた環境」でコマンドを実行する。


  • $ source [file]「表側=開いた環境」で、コマンドを実行する。


動作が変わる例

たとえば「変数に代入するだけ」の単純なスクリプトがある場合。


set_variable

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! # 変わる


動作が変わらない例

たとえばこういうファイルがあるときは。


just_echo

echo 'abc'


どちらも同じように echo される。

$ bash just_echo

abc

$ source just_echo
abc


以上

しかし、なぜ source なんて名前が付いているんだろう。本当に分かりづらい。

(source=源という名前は動きではなく、目的を表しているような気がする)

これが例えば run とかいう名前であれば、きっと多くの人が救われただろうに。