当我在 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
最佳答案
简短回答:
这不会(可靠地)工作。
长答案:
问题有三个:
- PHP 不使用您的登录 shell,而是使用
/bin/sh
- 必须在使用别名的上下文中设置别名
which
的输出取决于$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
,而 /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 来说,这也可能不同。
关于php - 如果命令在 mac 终端内运行,如何让 shell_exec 表现得像命令一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23426931/