source
コマンドsource
コマンドとは、他シェルファイルをカレントシェルで実行するコマンドです。
source
コマンドは、csh
、bash
などで利用できるコマンドです。
sh
ではsource
コマンドはサポートしていないため代わりに.
を使用します。
カレントシェルで実行するというのは、今開いているシェル(現在のプロセス)で実行するという意味です。
では、動作確認のために、3つのシェルファイルを用意します。A.sh
、B.sh
、C.sh
です。
A.sh
は変数定義してあるだけのシェルです。
B.sh
は、source
コマンドでA.sh
を実行した後、 C.sh
を実行します。
B.sh
とC.sh
は、A.sh
で定義した変数の値をecho
で出力しようと試みます。
A.sh
の中身です。
A.sh
hensu="Apple"
B.sh
の中身です。
B.sh
#!/bin/bash
source A.sh
echo "A.shの変数の値(B.sh):"${hensu}
./C.sh
C.sh
の中身です。
C.sh
#!/bin/bash
echo "A.shの変数の値(C.sh):"${hensu}
B.sh
を実行してみます。
実行結果
$ ./B.sh
A.shの変数の値(B.sh):Apple
A.shの変数の値(C.sh):
はい、B.sh
でA.sh
の変数の値を取得できていることが確認できました。
source
コマンドは、カレントシェルの中で実行されるので、B.sh
の中にA.sh
の内容が記述されているのと同義です。
一方で、C.sh
ではA.sh
の変数の値が取得できていません。
なぜこうなるかというと、B.sh
でC.sh
を実行するとき、./C.sh
とファイル名を指定して実行しているからです。
ファイル名を指定して実行すると、サブシェル(現在のシェルから新しく起動された別のシェル。つまりサブプロセス)でシェルファイルが実行されることになります。
カレントシェルとサブシェルは別のプロセスなので、B.sh
でsource
コマンドで実行したA.sh
の変数の値を、C.sh
で取得することはできないのです。
これを解決するにはexport
コマンドを使用します。
export
コマンドを使用することで、C.sh
でもA.sh
の変数の値が取得できるようになります。
export
コマンドについては以下の記事で解説しています。