2014-05-02 126 views
2

當我一個PHP腳本如何讓shell_exec的行爲就像命令在mac終端內運行一樣?

echo shell_exec("which php"); 

我得到下面的輸出中運行命令:運行Mac終端內部相同的命令時

/usr/bin/php 

然而

which php 

我收到以下輸出

php: aliased to /Applications/MAMP/bin/php/php5.5.10/bin/php 

我的問題是如何讓一樣,如果命令MAC終端中運行了shell_exec行爲?

注意:我已安裝ZSH

回答

2

簡短的回答:

這是不行的(可靠)。

龍答:

的問題有三個方面:

  1. PHP不使用你的登錄shell,但/bin/sh
  2. 別名在使用它們的上下文中設置
  3. 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也可能不同。

1

您無法在php級別上執行此操作。

您從您那裏獲得的輸出是由執行您的請求的shell程序生成的。這個shell不在php內部,而是一個在系統上控制的shell,它的行爲也依賴於系統。您不能期望在您的本地Linux系統上會出現與從某些Mac系統獲得的相同的行爲。

如果你的問題是爲什麼在這兩種情況下產生不同的輸出,那麼答案是:因爲安裝了不同的php解釋器。很顯然,shell會指出您正在運行的系統上已安裝並首選的那個。其他一切都沒有意義。在第二個例子中,php是指向該路徑的shell中的別名,在本地Linux系統中沒有任何值的信息。

相關問題