2016-11-23 3 views
0

まずI環境変数を設定するには、次のスクリプトを実行します。その後、私は実行PHPはENV変数をロードできないサーバーに内蔵され

ビン/ env.sh

#!/bin/bash 

export JWT_SECRET="29dvqfmREKeOgBhGtTogK1pAi+2/x45hKzxONHetwFM=" 
export DB_HOST=127.0.0.1 
export DB_NAME=myapp 
export DB_USER=user 
export DB_PASS=password 
export DB_PORT=3306 

bin/env.sh

を開発サーバーを起動する同じターミナルの次のスクリプト:

bin/de v.sh

#!/bin/bash 

php -d variables_order=EGPCS -S localhost:5001 -t ./public 

bin/dev.sh

サーバが起動するが、私はgetenv('DB_USER')をエコーするとき、それは空白です。

php -d variables_order=EGPCS -S localhost:5001 -t ./publicenv.shの足元に置くと事があります。

同じスクリプトに含まれていても動作しないのはなぜですか?どちらのスクリプトも同じ端末から実行されています

+2

'dev.sh'の先頭に' env.sh'をソースしてみましたか?他のファイルに 'source bin/env.sh'という行を追加します。これがうまくいけば教えてください。 – Inian

+0

@Inianが動作します。何故ですか? – BugHunterUK

+0

Downvoter explain? – BugHunterUK

答えて

1

あなたが直面している問題は、開発サーバーを実行している現在のシェルでbin/env.shで定義された変数がありません。したがって、あなたは、現在のセッションでの変数を利用できるようにするbin/dev.shの先頭に

source bin/env.sh

の行を追加する必要があります。

内蔵のshell内蔵のsourceが利用可能です。ファイルをソースする際には、現在のシェル環境でfilenameからコマンドを実行しています。

覚えておいてください。ソーシングは、シェルが元々呼び出されたシェル以外のシェルでスクリプトを「実行」するスクリプトとは異なります。例を挙げてよりよく説明すること

: -

は、次の内容のscript.shを考えてみましょう:

#!/bin/bash 

echo "foo: "$(env | grep FOO) 
export FOO=foo 
echo "foo: "$(env | grep FOO) 

我々は最初のスクリプトを実行する前に、我々は、現在の環境チェック:

$ env | grep FOO 

変数をFOOは定義されていません。ファイル

$ ./script.sh 
foo: 
foo: FOO=foo 

を実行するには、再び環境を確認してください:

$ env | grep FOO 

を変数FOOが設定されていません。

スクリプト出力は、変数が設定されていることを明確に示しています。スクリプトを実行するチェックポストは、新しいシェルで変更が行われたため、変数が設定されていないことを示しました。現在のシェルはスクリプトを実行するために新しいシェルを生成し、エクスポートされたすべての変数は、その生成されたシェルの存続時間までしか使用できません。 スクリプトが終了すると、新しいシェルは破棄されます。新しいシェルの環境に対するすべての変更は、新しいシェルで破棄されます。出力テキストのみが現在のシェルに出力されます。

今、私たちは、ファイルをsource

$ source script.sh 
foo: 
foo: FOO=foo 

$ env | grep FOO 
FOO=foo 

あなたは、変数FOOが設定されている今見ることができます。

+0

驚くべき答え! – BugHunterUK

0

exportコマンドは、サブシェルで変数を使用できるようにしますが、親環境には変数を追加しません。スクリプトを実行して現在の環境を更新する場合は、sourceを使用してください。

関連する問題