首先,我运行以下脚本来设置环境变量:
仓/ 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
的脚下,那就可以了。
如果它在同一个脚本中,为什么会起作用,但不是这样?这两个脚本都是从同一个终端运行的
答案 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
。