简短回答:
这不会起作用(可靠地)。
长答案:
问题有三个:
- PHP 不使用您的登录 shell,但是
/bin/sh
- 必须在使用别名的上下文中设置别名
- 的输出
which
依赖于取决于$PATH
To see 1.您可以通过 echo 打印正在运行的 shell 的名称$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
Unless sh
链接到zsh
,这意味着,如果您想使用 zsh 内置命令,您必须使用以下命令运行命令zsh
:
echo shell_exec("zsh -c 'which php'");
这开始/bin/sh
,这又开始zsh
,然后运行该命令。
虽然您可以使用 PHP 来解决sh
,第二个问题更严重:别名只能在定义它们的实例中设置。大多数时候,这种情况发生在某些配置文件中(例如~/.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
总之,这意味着,使用which
从 PHP 脚本内部找出 PHP 脚本的来源/位置是完全不可靠的方法。php
。更重要的是,其输出取决于$PATH
,对于交互式和非交互式 shell 也可能不同。