【 source 】【.】 ファイルからコマンドを読み込んで現在のシェル環境で実行 【 Linuxコマンドまとめ 】 | Linux Fan

【 source 】【.】 ファイルからコマンドを読み込んで現在のシェル環境で実行 【 Linuxコマンドまとめ 】

2018年7月18日

「Linuxコマンドまとめ」カテゴリでは、Linuxのコマンドについて、基本的な実行例とオプションを分かりやすくまとめます。

source」は「ファイルからコマンドを読み込んで現在のシェルで実行する」コマンドです。「.」コマンドも同じように動作します。

なお「source」および「.」は、Bashなどのシェル自身が処理を行う「内部コマンド(ビルトインコマンド)」です。

基本的な使い方

source」および「.」コマンドの基本書式は、以下の通りです。

source ファイルパス [引数]
. ファイルパス [引数]

コマンドオプションはありません。

主な用途

source」および「.」は、「~/.bashrc」や「~/.profile」といった「シェルの設定ファイル」を更新した後で、すぐに変更内容を実行中のシェルに反映する時によく用いられます。

たとえば次の記事では、「~/.bashrc」に環境変数「PROMPT_COMMAND」の設定を追加する例を紹介しました。

Bashがインタラクティブシェルとして起動した場合、「~/.bashrc」を読み込んで自動的に実行します。しかし「~/.bashrc」を変更しても、起動済みのBashは自動で再読み込みを行いません。編集内容を実行中のBashに反映するには、次のように「source」もしくは「.」コマンドで「~/.bashrc」を読み込んで実行させます。

source ~/.bashrc

もしくは

. ~/.bashrc

「別のシェルで実行する」場合との違い

「シェルスクリプト」を実行する場合、通常は「source」および「.」を使いません。次のように、「bash」などの引数として実行するか、シェルスクリプトに実行権を付けて実行します。

bashの引数として実行する例

bash script.sh

chmodで実行権を付けてから実行する例

chmod +x script.sh
./script.sh

これらは、実行中のインタラクティブシェル(対話的シェル)とは別のシェルでスクリプトを実行します。

これに対して、「source」および「.」は実行中のインタラクティブシェルでファイル中のコマンドを実行します。

たとえば、次の内容で「script1.sh」を作成したとします。

#!/bin/bash

HOGE=hoge
echo $HOGE

シェル変数「HOGE」に文字列「hoge」を設定し、出力するだけのスクリプトです。これを、bashの引数として「通常のシェルスクリプトとして実行」すると、次のようになります。

$ bash script1.sh 
hoge

スクリプトを終了すると、次のようにシェル変数「HOGE」には何も設定されていません。

$ echo $HOGE

これは、bashの引数としてシェルスクリプトを実行した場合は、別のシェルによって実行されるためです。そのシェルが終了すれば、スクリプト内で設定したシェル変数も失われます。

一方、「source」コマンドの引数として「script1.sh」の内容を読み込むと、次のようになります。

$ bash script1.sh 
hoge
$ echo $HOGE
hoge

シェル変数「HOGE」に文字列「hoge」が設定されます。このように、実行中のシェルにコマンドを入力して実行した場合と同じように各コマンドが実行されるのが、「source」および「.」コマンドの特徴です。

では、次の内容で「script2.sh」を作成し、「bash」と「source」コマンドそれぞれで実行するとどうなるでしょうか。

#!/bin/bash

cd $1
pwd

このスクリプトは、第1引数に与えたディレクトリに「cd」し、「pwd」コマンドでカレントディレクトリを出力します。

最初は、「bash script2.sh /tmp」と実行する例です。

$ pwd
/home/lintaro
$ bash script2.sh /tmp
/tmp
$ pwd
/home/lintaro

このように、シェルスクリプト内では「/tmp」に移動しましたが、元のシェルのカレントディレクトリは変化していません。

次に、「source script2.sh /tmp」と実行する例です。これは、「. script2.sh /tmp」と実行しても同じようになります。

$ pwd
/home/lintaro
$ source script2.sh /tmp
/tmp
$ pwd
/tmp

カレントディレクトリが「/tmp」に変わります。

このように、「source」および「.」を用いてスクリプトを実行すると、実行中のインタラクティブシェル環境に影響が及びます。
一方、シェルスクリプトをbashなどの引数として実行したり、実行権を付けて実行した場合、別のシェルで実行されるため、元のシェル環境には影響がありません。

「source」コマンドのヘルプ

※「.」のヘルプも同じ内容

source: source filename [arguments]
    ファイルを読み込み現在のシェルでコマンドを実行します。
    
    FILENAME を読み込み現在のシェルでコマンドを実行します。$PATH の項目が
    FILENAME が含まれるディレクトリを見つけるために使用されます。引数
    ARGUMENTS が与えられた場合 FILENAME を実行する際の位置パラメーターと
    して使用されます。
    
    終了ステータス:
    FILENAME で最後に実行したコマンドのステータスを返します。FILENAME が
    読み込めなかった場合は失敗を返します。

「source」および「.」コマンドのマニュアル

 .  filename [arguments]
source filename [arguments]
       filename からコマンドを読み込み、現在のシェル環境の下で実行します。 filename 内の最後に実行したコマンドの終了ステータスを返します。 filename  にスラッシュが含まれて
       いない場合、 filename は PATH に含まれるディレクトリから探されます。 PATH 内で検索されるファイルは、実行可能である必要はありません。 bash が posix モード 以外で動作
       しているときは、 PATH 中でファイルを見つけられなかった場合に、 カレントディレクトリが検索されます。 組み込みコマンド shopt に対する sourcepath  オプションが無効にさ
       れている場合、  PATH の検索は行われません。 何らかの arguments が指定された場合、これらの引き数は filename を実行したときの位置パラメータとなります。 指定されなかっ
       た場合は、位置パラメータは変更されません。 返却ステータスはスクリプト内で最後に実行したコマンドのステータスです (コマンドが全く実行されなければ 0  です)。  filename
       が見つからない場合や読み込めない場合には偽となります。

関連項目