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