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


137

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

#!/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

~$: 

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

回答:


194

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

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

source ./script.sh
echo "$BASE"

生産します

/home/develop/trees

source多くの場合、スクリプトの中で見られるコマンドは、のために、bashの同義語である.POSIX標準の一部である、(そう.例えば、ダッシュで利用可能ですが、sourceではありません)。

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

. script.shそしてsource script.sh最初にscript.shinを探すPATHので、へのパスを指定する方が安全script.shです。)


29
exportサブシェルに変数を渡す必要はありません。サブシェルは、変数や関数などを含む現在のシェルのコピーです。エクスポートされた変数は、そのプロセスが別のシェルであるかどうかに関係なく、シェルから生成される新しいプロセスにコピーされます。次に、.ソーシング用のPOSIXコマンドです。Bashはsourceより読みやすい同義語として追加しますが、shで使用できることに依存することはできません。最後. ./scriptの代わりに、. scriptあなたは驚きを避けたい場合。mywiki.wooledge.org/BashFAQ/060
geirha

スクリプトのソースを取得し、パイプを使用する場合、親はソース環境を利用できないことに注意してください。たとえば、「source setit.sh」は大丈夫です。「source setit.sh | tee setit.log」は大丈夫ではありません。驚いた。直感的ではありません。
gaoithe

10

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

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

. ./script.sh

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


5

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

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

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

-1

このようなものを試すことができます

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.