Categories: shell

【shell】sourceコマンドの使い方

sourceコマンド

sourceコマンドとは、他シェルファイルをカレントシェルで実行するコマンドです。
sourceコマンドは、cshbashなどで利用できるコマンドです。
shではsourceコマンドはサポートしていないため代わりに.を使用します。
カレントシェルで実行するというのは、今開いているシェル(現在のプロセス)で実行するという意味です。

動作確認

では、動作確認のために、3つのシェルファイルを用意します。A.shB.shC.shです。
A.shは変数定義してあるだけのシェルです。
B.shは、sourceコマンドでA.shを実行した後、 C.shを実行します。
B.shC.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.shA.shの変数の値を取得できていることが確認できました。
sourceコマンドは、カレントシェルの中で実行されるので、B.shの中にA.shの内容が記述されているのと同義です。

一方で、C.shではA.shの変数の値が取得できていません。
なぜこうなるかというと、B.shC.shを実行するとき、./C.shとファイル名を指定して実行しているからです。

ファイル名を指定して実行すると、サブシェル(現在のシェルから新しく起動された別のシェル。つまりサブプロセス)でシェルファイルが実行されることになります。

カレントシェルとサブシェルは別のプロセスなので、B.shsourceコマンドで実行したA.shの変数の値を、C.shで取得することはできないのです。

これを解決するにはexportコマンドを使用します。
exportコマンドを使用することで、C.shでもA.shの変数の値が取得できるようになります。

exportコマンドについては以下の記事で解説しています。

issiki_wp

Share
Published by
issiki_wp