環境変数とシェル変数の違い

環境変数とシェル変数の違い

環境変数は子プロセスから継承されますが、シェル変数は継承されません。ただし、次のテストは、シェル変数が環境変数と同様に子プロセスに表示されることを示しています。違いは何ですか?

> bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
> export TEST="ENV_TEST"    #env var
> sh -c "echo \$TEST"
ENV_TEST
> TEST="SHELL_TEST"         #shell var
> sh -c "echo \$TEST"       #shell var is seen in child process
SHELL_TEST

答え1

2番目の割り当てでは、TEST="SHELL_TEST"変数のエクスポートはキャンセルされません。それでも「子孫から継承」と表示されます。そして、子プロセスが継承する値は、現在の親プロセスに設定されている値です。
つまり、2番目の割り当てはTESTシェル変数の状態を復元せず、その用語はまだ環境変数です。

子プロセスで設定を解除するには、エクスポートをキャンセルする必要があります。

$ typeset +x TEST
$ sh -c 'echo $TEST'

$

関連情報