web-dev-qa-db-ja.com

シェルスクリプトで環境変数を設定してもシェルに表示されない

いくつかの環境変数を設定するために呼び出すことができるシェルスクリプトを使用したいと思います。しかし、スクリプトの実行後、bashで「printenv」を使用した環境変数が表示されません。

これが私のスクリプトです:

#!/bin/bash

echo "Hello!"
export MYVAR=boubou
echo "After setting MYVAR!"

「./test.sh」を実行すると、次のようになります。

Hello!
After setting MYVAR!

「printenv MYVAR」を実行しても何も表示されません。

私が間違っていることを教えてもらえますか?

29
GDICommander

これが環境変数のしくみです。すべてのプロセスには環境のコピーがあります。プロセスがコピーに加えた変更は、プロセスの子に伝達されます。ただし、それらはプロセスの親には伝播しません。

これを回避する1つの方法は、sourceコマンドを使用することです。

source ./test.sh

または

. ./test.sh

(2つの形式は同義です)。

これを行うと、サブシェルでスクリプトを実行する代わりに、bashはプロンプトで入力されたかのようにスクリプトの各コマンドを実行します。

52
NPE

別の代替案は、スクリプトprintに設定する変数を_echo export VAR=value_で設定し、メインシェルでeval "$(./test.sh)"を実行することです。これは、さまざまなプログラムで使用されるアプローチです。設定する環境変数を提供するresize、dircolors]。

これは、スクリプトに他の出力がない場合(または_>&2_を使用してstderrに他の出力が表示される場合)にのみ機能します。

3
Random832