【Mac/Linux】シェルスクリプトから別のシェルスクリプトを呼び出す方法

本記事はシェルスクリプトから別のシェルスクリプトを呼び出す方法を解説しています.

別のシェルスクリプトを呼び出す方法

シェルスクリプトから別のシェルスクリプトを呼び出す方法は,以下の3種類があります.

  • sourceコマンド
  • . (ドット [ピリオド])
  • 呼び出すシェルスクリプトのパスを記載

sourceコマンドでの呼び出し

例としてsourceコマンドでの呼び出しを確認してみましょう. 以下のようなディレクトリ構造でb.sh内からa.shを呼び出すようにします.

.
├── a.sh
└── b.sh

<ファイルの中身>

a.sh


#!/bin/zsh

a_var=100
echo 'echo from a.sh'

b.sh


#!/bin/zsh

source ./a.sh
echo ${a_var}

b.shを実行すると以下のようになります.


./b.sh

echo from a.sh
100

結果を見てみるとa.shで記載した処理が実行されており,さらにa.shで定義した変数(a_var)がb.shに引き継がれて出力されています.

参考

上記のコードを試してみる場合a.sh, b.shそれぞれに権限付与が必要です.
a.sh, b.shがある階層で以下のコマンドを実行して権限を付与すればOKです.


chmod 755 a.sh b.sh

それぞれの方法の違い

違いは以下のとおりです.

  • sourceもしくは.コマンド:実行したシェルスクリプトと同じプロセスで動作
  • シェルスクリプトをそのまま呼び出す場合:別プロセスで動作

実験

test_a.shtest_b.shを準備します.1

<ファイルの中身>

test_a.sh


#!/bin/zsh

a_var=100
a_process=$$  # $$はカレントプロセスのプロセス番号を保持

echo "test_a current_process: ${a_process}"
echo 'echo from test_a.sh'

test_b.sh


#!/bin/zsh

b_process=$$

echo "current_process:${b_process}"

echo -source-----
# sourceで呼び出す
a_var=0
source ./test_a.sh
echo ${a_var}

echo -ドット-----
# . (ドット[ピリオド])で呼び出す
a_var=0
. ./test_a.sh
echo ${a_var}

echo -そのまま-----
# そのまま呼び出す
a_var=0
./test_a.sh
echo ${a_var}

test_b.shを実行した結果は以下のとおりです.


./test_b.sh

current_process:8730
-source-----
test_a current_process: 8730
echo from test_a.sh
100
-ドット-----
test_a current_process: 8730
echo from test_a.sh
100
-そのまま-----
test_a current_process: 8731
echo from test_a.sh
0

source.コマンドでは実行したシェルスクリプトと同じプロセスで動作していますが,シェルスクリプトをそのまま記載している部分はプロセス番号が異なっています.

そのため,シェルスクリプトをそのまま実行している箇所では変数が上書きされることなく0が出力されています.

ひとこと

(あまりないような気がしますが)関数や変数などをまとめて定義した.shファイルを読み込むことにも使えそうです.

source.の違いはよくわからなかったので,もしご存知の方がいらっしゃれば是非ご連絡ください.


  1. それぞれのファイルは同じ階層に配置しchmodで権限を付与しておきます(前項の「参考」を参照)