内置服务器的PHP无法加载env变量

时间:2016-11-23 19:59:23

标签: php bash

首先,我运行以下脚本来设置环境变量:

仓/ 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

然后我在同一个终端中运行下一个脚本来启动开发服务器:

仓/ dev.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 个答案:

答案 0 :(得分:1)

您遇到的问题是您在bin/env.sh中定义的变量在运行开发服务器的当前shell中是不可用的。因此,您需要添加一行

source bin/env.sh

bin/dev.sh的开头,使变量在当前会话中可用。

有一个内置的shell内置source可用于此。在获取文件时,您实际上是在当前shell环境中从filename执行命令。

记住,源代码不同于运行一个脚本,该脚本在新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将被销毁。使用新shell销毁新shell中对环境的所有更改。仅在当前shell中打印输出文本。

现在我们source文件:

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

$ env | grep FOO
FOO=foo

您现在可以看到变量FOO已设置。

答案 1 :(得分:0)

export命令使变量可用于子shell,它不会将它们添加到父环境中。如果要运行脚本来更新当前环境,请使用source