Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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 とかいう名前であれば、きっと多くの人が救われただろうに。

YumaInaura
Ruby on Rails 業務経験 約5年 / Perl PHP Python Golang Linux Apache MySQL BigQuery Jenkins ansible AWS など / いなうらゆうま / YumaInaura / 稲浦悠馬
http://twitter.com/yumainaura
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away