簡短的回答:
這是不行的(可靠)。
龍答:
的問題有三個方面:
- PHP不使用你的登錄shell,但
/bin/sh
- 別名在使用它們的上下文中設置
which
的輸出取決於$PATH
要查看您可以打印運行shell的名稱呼應$0
% echo $0
zsh
% php -r 'echo shell_exec("echo \$0");'
sh
正如你所看到的,PHP開始sh
而不是zsh
。這meens它也採用的sh
的建宏或查找命令,如果沒有內置:
% php -r 'echo shell_exec("which which");'
/usr/bin/which
% zsh -c 'which which'
which: shell built-in command
除非sh
鏈接zsh
,該meens,如果你想使用你必須運行的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
總之,這意味着,在使用which
從PHP腳本里面找出一個完全不可靠的方式php
的來源/位置。更重要的是,其輸出取決於$PATH
,對於交互式和非交互式shell也可能不同。