🖥

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

2023/08/26に公開

ごく基本的なことだが、今までよく考えずに使っていた。
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 とかいう名前であれば、きっと多くの人が救われただろうに。

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2016-07-21

Discussion