简答:
这不起作用(可靠)。
长答案:
问题有三个:
- 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,然后启动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,这也可能不同。