LoginSignup
165

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

Last updated at Posted at 2016-07-21

ごく基本的なことだが、今までよく考えずに使っていた。
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オープンチャットもご利用ください。

Twitter

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
165