如何让shell_exec的行为就像命令在macterminal内运行?

当我在一个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

简短的回答:

这不可行(可靠)。

很长的回答:

问题有三个:

  1. PHP不使用你的登录shell,而是使用/bin/sh
  2. 别名必须在使用的环境中设置
  3. 其输出取决于$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系统中没有任何值的信息。