検証手順
前提:
①現シェル環境でnumberを1に設定
②子プロセスでnumberを確認してから2に変更
※スクリプトは下記ファイルを使用
sub.sh
[pirlo@minidns ~]$ cat sub.sh
echo number=$number //numberが定義されているかを確認
number=2 //サブシェル環境でnumberを2に変更
echo number=$number //更新後のnumberを表示
[pirlo@minidns ~]$
確認開始
//現シェル環境のnumberを確認
[pirlo@minidns ~]$ echo $number
1
//子プロセスのシェル環境でnumberが定義されていないことを確認でき、2に設定
[pirlo@minidns ~]$ ./sub.sh
number=
number=2
//現シェル環境に戻ってから再度numberを確認し、子プロセスの影響がないことを確認
[pirlo@minidns ~]$ echo $number
1
//bashではなくsourceでスクリプトを実行。bashと異なり、最初の確認ではnumberが取得できた
[pirlo@minidns ~]$ source sub.sh
number=1
number=2
//再度numberを取得して、変更されていることを確認
[pirlo@minidns ~]$ echo $number
2
[pirlo@minidns ~]$
結論
・sourceでの実行は、実行されたスクリプトの中身を現シェル環境にコピーして実行すると考えて良さそう
・bashでの実行は、新規のシェル環境でスクリプトが実行され、独自のシェル変数を持ち、親シェル環境からシェル変数を継承せず、自分のシェル変数も親シェル環境へ反映しないらしい。