如何在bash脚本中访问PHP环境变量?

4

我正在编写一个旨在运行在远程AMP堆栈上的Bash脚本。该脚本需要访问PHP预定义环境变量 ($_ENV)。

这是我想要的:

db_host=$(php -r 'echo $_ENV{DATABASE_SERVER};')
echo "The DB Host is: $db_host"
# output: "The DB Host is: internal-db.s173785.gridserver.com"

这是我得到的实际结果:
# METHOD 1
db_host1=$(php -r 'echo $_ENV{DATABASE_SERVER};')
echo "The DB Host is: $db_host1"
# output: "The DB Host is: "

# METHOD 2
db_host2=`php -r 'echo get_env(DATABASE_SERVER);'`
echo "The DB Host is: $db_host2"
# output: "The DB Host is: "

两种方法都不起作用,两个变量都为空。我知道这个PHP变量是被设置了的,因为当我在终端中输入这个(在ssh进入服务器后),我会得到期望的值:

$ php -r 'echo $_ENV{DATABASE_SERVER};' 
# outputs: "internal-db.s173785.gridserver.com"

从技术上讲,以上方法应该是有效的,因为我在我的脚本中成功地实现了这一点:

php_user=$(php -r 'echo getenv("USER");')
echo php_user is $php_user
# outputs: "php_user is myusername"

请问我做错了什么?

***更新*****

需要说明的是,我是从本地机器上调用此脚本的:

ssh -t user@mydomain.com "myscript backup_remote_db"

"myscript"是我可执行的bash脚本的名称,"backup_remote_db"是我传递给它的函数,其中包含上面的代码。

然而,这可能不是原因,因为当我在脚本中输出$USER时,它会回显远程用户,而不是本地用户...

***更新2******

以下是我最终使其工作的方法:

db_host=$DATABASE_SERVER
echo "The DB Host is $db_host"
# output: "The DB Host is: internal-db.s173785.gridserver.com"

只有当我对脚本的调用方式进行这样的调整才能实现:

ssh -t user@mydomain.com ". /etc/profile; myscript backup_remote_db"

我得到了 internal-db.s173785.gridserver.com!! 太棒了。 - JP Lew
1
你确定这个脚本在相同的环境下运行吗?也许它是从其他用户或类似的情况下运行的? - vp_arth
1
DATABASE_SERVER 最初是在哪里设置的? 是否在您的 .bashrc 中? - Ja͢ck
1
嗯,也许是/etc/profile吧?它一定在某个地方 :) - Ja͢ck
2
那么你需要在脚本中添加. /etc/bash.bashrc,然后就可以使用$DATABASE_SERVER了。 - Ja͢ck
显示剩余7条评论
1个回答

5

你不需要使用php来获取shell中的环境变量

只需打印即可:

 echo "The DB Host is $DATABASE_SERVER"

如果您在使用php时收到“Use of undefined constant PATH”通知,则需要将字符串参数包装起来。这应该可以解决问题:

v=$(php -r 'print_r(getenv("DATABASE_SERVER"));')
echo "DB: $v"

更新: 使用SSH登录时,不会自动加载.bashrc文件。你需要在.bash_profile文件中手动引用它,方法如下:

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

bashecho 中使用单引号时,$v 不会被解释(它会打印出 DB: $v),而双引号则会打印出预期的输出。 - Daniel W.
不幸的是,这对我没有用,v 仍然为空白。 - JP Lew
输入命令 cat ~/.bashrc 后提示:没有这个文件或目录。我找不到 .bashrc 文件。 - JP Lew
将其简单更改为/etc/bash.bashrc - vp_arth
我查看了/etc/bash.bashrc文件,也没有设置DATABASE_SERVER,因此无法通过源代码进行设置。我将进一步调查它的设置位置。非常感谢你们的帮助,我会回来的。 - JP Lew
1
@vp_arth 是的,这就是答案。我终于找到了我需要的点文件,它是 /etc/profile。我更新了我的 bash 脚本,在运行脚本之前包含 . /etc/profile,现在它可以工作了。所以你教会了我两件事:首先,环境变量存在独立于 PHP。其次,在通过命令行 ssh 进入服务器时,执行命令与通过 ssh 执行命令之间存在差异。在后一种情况下,它在幕后源所有种类的点文件。谢谢大家。 - JP Lew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接