当我在一个PHP脚本中运行命令
echo shell_exec("which php");
我得到以下输出:
/usr/bin/php
但是,当在macterminal内运行相同的命令
which php
我得到以下输出
php: aliased to /Applications/MAMP/bin/php/php5.5.10/bin/php
我的问题是如何让shell_exec像mac命令terminal内运行的行为?
注意:我已经安装了ZSH
简短的回答:
这不可行(可靠)。
很长的回答:
问题有三个:
/bin/sh
$PATH
查看1.您可以通过回显$0
来打印正在运行的shell的名称
% echo $0 zsh % php -r 'echo shell_exec("echo \$0");' sh
正如你所看到的,PHP开始sh
而不是zsh
。 如果没有内建的话,它也会使用sh
的内建函数或寻找命令:
% php -r 'echo shell_exec("which which");' /usr/bin/which % zsh -c 'which which' which: shell built-in command
除非sh
链接到zsh
,那么,如果你想使用zsh的内建函数,你必须用zsh
运行你的命令:
echo shell_exec("zsh -c 'which php'");
这会启动/bin/sh
,然后启动zsh
,然后运行该命令。
虽然您可以使用sh
解决PHP问题,但是第二个问题更加严重:别名仅在定义它的实例中设置。 大多数情况下,这在一些配置文件中发生(例如~/.zshrc
)。 但是,当以非交互方式使用zsh
时,不会加载这些配置文件,也不zsh
别名传递给子进程:
% grep foo ~/.zshrc alias foo=bar % which foo foo: aliased to bar % zsh -c 'which foo' foo not found % php -r 'echo shell_exec("zsh -c which\ foo");' foo not found
总之,这意味着,从PHP脚本内使用which
是一个完全不可靠的方式来找出php
的起源/位置。 更为重要的是,其输出取决于$PATH
,对于交互式和非交互式shell来说也可能不同。
你不能这样做的PHP水平。
您从您获得的输出是由执行您的请求的shell程序生成的。 那个shell不在php内部,而是一个在系统上控制的shell,它的行为也依赖于系统。 你不能期望在你的本地Linux系统上有同样的行为,就像你从某个Mac系统上得到的一样。
如果你的问题是为什么在这两种情况下产生不同的输出,那么答案是:因为安装了不同的php解释器。 很显然,shell会指出你正在运行的系统上安装的并且是首选的。 其他一切都没有意义。 在第二个例子中,php是指向那个路径的shell中的一个别名,在你的本地Linux系统中没有任何值的信息。