如果命令在mac终端内运行,如何让shell_exec行为?

时间:2014-05-02 11:21:25

标签: php linux macos shell zsh

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

2 个答案:

答案 0 :(得分:2)

简答:

这不会(可靠)。

答案很长:

问题有三个:

  1. PHP不使用您的登录shell,而是/bin/sh
  2. 别名必须在使用它们的上下文中设置
  3. which的输出取决于$PATH
  4. 要查看 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时,不会加载这些配置文件,也不会将别名传递给子进程:

    % 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系统上任何值的信息。