2つのスクリプトがあるとしましょう
test1.sh
#!/bin/sh
. ./test2.sh
foo
test2.sh
#!/bin/sh
foo(){
echo "bar"
}
最初のスクリプトを呼び出すと問題ありません
$ ./test1.sh
bar
しかし、その後電話をかけようとするfoo
とうまくいきません。
$ foo
bash: foo: command not found
を実行する./test1.sh
と、サブプロセスが生成されます。test1.sh
ソースの場合、が定義さtest2.sh
れている場合、そのサブプロセスのコンテキストのみが変更されます。foo()
完了するとすぐtest1.sh
に、サブプロセスは終了し、インタラクティブシェルはの知識を持ちませんfoo()
。
電話source test2.sh
をかけると、希望する結果が得られます。新しいターミナルを起動するたびにfooを呼び出せるようにする場合は、その定義を.bashrcまたは.profileファイルに配置します。
test1.shをソースすると、目的の結果が得られます。
$ . test1.sh
bar
$ foo
bar