2016-11-23 42 views
0

首先我運行下面的腳本來設置環境變量: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 ./public放在env.sh的腳下就行了。

爲什麼它在相同的腳本中工作,但不會以其他方式工作?這兩個腳本都從同一個終端運行

+2

你嘗試在'dev.sh'的開頭採購'env.sh'嗎?在另一個文件中添加一行'source bin/env.sh'。讓我知道如果這工作。 – Inian

+0

@Inian工作。這是爲什麼? – BugHunterUK

+0

Downvoter解釋? – BugHunterUK

回答

1

您面臨的問題不是您在bin/env.sh中定義的變量在運行開發服務器的當前shell中可用。因此,你需要在bin/dev.sh的開頭添加一行

source bin/env.sh

,使當前會話中可用的變量。

有一個內置的shell內置source只是爲此。在獲取文件時,您實際上是在當前shell環境中從文件名執行命令。

記住採購不同於運行一個腳本,該腳本在一個新的shell中執行腳本,而不是最初調用的shell。

爲了解釋用一個例子更好地: -

考慮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未設置。

腳本輸出清楚地表明該變量已設置。運行腳本的檢查文章顯示變量未設置,因爲更改是在新的shell中進行的。當前shell產生了一個新的shell來運行該腳本,並且所有導出的變量都可用,直到該衍生shell的生命週期。 腳本終止後,新的外殼被銷燬。新外殼對環境的所有更改都會被新外殼破壞。只有輸出文本被打印在當前shell中。

現在我們source文件:

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

$ env | grep FOO 
FOO=foo 

你可以看到現在變量FOO設置。

+0

令人驚歎的答案! – BugHunterUK

0

export命令使變量可用於子shell,但不會將它們添加到父級環境。如果要運行腳本以更新當前環境,請使用source