web-dev-qa-db-ja.com

環境変数を設定するBASHスクリプトが機能しない

必要に応じていくつかの環境変数を設定する次のスクリプトを作成しました。

#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH

端末の下に表示されるコマンドと結果の下:スクリプトは実行されますが、変数は最後に設定されません。

~$: ./script.sh
/home/develop/trees
/bin:......:/home/develop/trees
~$: echo $BASE

~$: 

どうしましたか?前もって感謝します。ミルコ

132
MirkoZa

exportは、exportコマンドが実行されたシェルの子プロセスに変数の割り当てをエクスポートします。コマンドライン環境は、スクリプトのシェルのであるため、変数の割り当ては表示されません。

.(またはsource)bashコマンドを使用して、現在のシェル環境でスクリプトコマンドを実行し、目的を達成できます。

source ./script.sh
echo "$BASE"

生産します

/home/develop/trees

スクリプトでよく見られるsourceコマンドは、POSIX標準の一部である.のbash同義語です(たとえば、.はダッシュで使用できますが、sourceはそうではありません)。

. ./script.sh     # identical to "source ./script.sh"

. script.shおよびsource script.shは最初にPATHscript.shを検索するため、script.shへのパスを指定する方が安全です。)

186
user21322

スクリプトを実行すると、サブシェルで実行されます。変数は、そのサブシェルのコンテキスト内でのみ有効です。それらを.bashrcまたは.profileに設定し、 変数とサブシェル を読んでください。 exportステートメントは、例のように上にではなく、階層(現在のシェルとそのすべてのサブシェル)で機能します。

または(現在のシェルの環境にスクリプトを本当に影響させたい場合)、次のように実行します:

. ./script.sh

これにより、現在のシェルで実行されますが、変数を階層に渡すこともできません。

10
con-f-use

手間をかけずに環境変数を設定したいことがよくあります。

これが、この便利さを実装するために.bashrcに追加するものです。

defect() {
    if [ $1 ] && [ -z $2 ]
    then
        eval 'export DEFECT=$1'
        return 0
    else
        echo 'Usage: defect {number}'
        return 1
    fi
}
5
jlettvin