如何从脚本中重新加载环境变量

如何从脚本中重新加载环境变量

我希望能够重新生成测试环境中的环境变量所保存的值,并让 PHP-FPM 读取新值。

我编写了一个脚本,重新生成环境变量,将其写入文件,然后重新启动 PHP-FPM

# make errors error
set -eufx -o pipefail

# Generate the env settings file
php bin/cli.php genEnvSettings dev /etc/profile.d/imagickdemos.sh

# reload the env values
set +u
source ~/.bashrc
source ~/.bash_profile
set -u

#restart PHP-FPM
/etc/init.d/php-fpm restart

运行此脚本不会改变 PHP-FPM 接收的环境变量。

如果我在运行上述脚本后直接从 CLI 运行以下命令:

source ~/.bash_profile
/etc/init.d/php-fpm restart

然后,环境变量的新值可供 PHP-FPM 使用。也就是说,就好像source ~/.bash_profile脚本内部没有任何效果一样。

如何重新加载该脚本中的环境变量,而不必直接从命令行运行重新加载?或者有没有更好的方法可以在重新启动服务时获取新编写的环境设置文件?

我正在使用 Centos 6.4,以防有任何区别。

答案1

我猜你的 .bash_profile 有一个条件,if [ -n "$PS1" ]这使得它只对交互式 shell 有效。测试它的方法是set -x在脚本中检查分配的跟踪输出。

至于您的另一个问题:设置服务器环境的通常方法是将导出分配写入/etc/sysconfig/servername/etc/default/servername(无论哪一个直接由 init.d 脚本提供)。

答案2

听起来从 init.d 脚本中获取环境脚本是标准做法,但对我来说,阻止环境脚本重新加载的实际问题是标志set -f

在文件 /etc/bashrc 中,看起来无论如何它都应该获取文件:

for i in /etc/profile.d/*.sh; do
    if [ -r "$i" ]; then
        if [ "$PS1" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done
unset i

但是 -f 标志会关闭文件通配。我已删除 -f 标志,改为shopt -s failglob在通配失败时显示哪些错误。

相关内容