いくつかの環境変数を設定するために呼び出すことができるシェルスクリプトを使用したいと思います。しかし、スクリプトの実行後、bashで「printenv」を使用した環境変数が表示されません。
これが私のスクリプトです:
#!/bin/bash
echo "Hello!"
export MYVAR=boubou
echo "After setting MYVAR!"
「./test.sh」を実行すると、次のようになります。
Hello!
After setting MYVAR!
「printenv MYVAR」を実行しても何も表示されません。
私が間違っていることを教えてもらえますか?
これが環境変数のしくみです。すべてのプロセスには環境のコピーがあります。プロセスがコピーに加えた変更は、プロセスの子に伝達されます。ただし、それらはプロセスの親には伝播しません。
これを回避する1つの方法は、source
コマンドを使用することです。
source ./test.sh
または
. ./test.sh
(2つの形式は同義です)。
これを行うと、サブシェルでスクリプトを実行する代わりに、bash
はプロンプトで入力されたかのようにスクリプトの各コマンドを実行します。
別の代替案は、スクリプトprintに設定する変数を_echo export VAR=value
_で設定し、メインシェルでeval "$(./test.sh)"
を実行することです。これは、さまざまなプログラムで使用されるアプローチです。設定する環境変数を提供するresize、dircolors]。
これは、スクリプトに他の出力がない場合(または_>&2
_を使用してstderrに他の出力が表示される場合)にのみ機能します。