当我在php脚本中运行命令时
echo shell_exec("which php");
我得到以下输出:
/usr/bin/php
但是在mac终端中运行相同的命令时
which php
我收到以下输出
php: aliased to /Applications/MAMP/bin/php/php5.5.10/bin/php
我的问题是如何让shell_exec像在mac终端内运行命令一样?
注意:我已安装ZSH
答案 0 :(得分:2)
简答:
这不会(可靠)。
答案很长:
问题有三个:
/bin/sh
which
的输出取决于$PATH
要查看 1。您可以通过回显$0
% 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
时,不会加载这些配置文件,也不会将别名传递给子进程:
% 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也可能不同。
答案 1 :(得分:1)
你不能在php级别上这样做。
您从调用中获得的输出是由执行请求的shell程序生成的。该shell不在php中,而是在系统上控制的shell,其行为也取决于系统。您不能指望本地Linux系统上的行为与从某些Mac系统获得的行为相同。
如果您的问题是为什么在两种情况下都会生成不同的输出,那么答案是:因为安装了不同的PHP解释器。显然,shell会将您指向正在运行的系统上安装和首选的shell。其他一切都没有意义。事实上,在第二个示例中,php是指向该路径的shell中的别名,并不是本地Linux系统上任何值的信息。