2016-02-01 62 views
2

我有一個簡單的bash腳本,我從我的php代碼中調用以找出我的apache和nginx的版本。sh:2:1:not found - 將多個php參數傳遞給bash腳本

$webroot = getcwd(); 

function get_version($name) 
{ 
    global $webroot; 

    switch ($name) 
    { 
     case "apache": 
      $path = shell_exec("whereis apachectl | awk '{ print $2 }'"); 
      $version = shell_exec("sudo $webroot/scripts/get_version $path 1 2>&1"); 
      break; 
     case "nginx": 
      $path = shell_exec("whereis nginx | awk '{ print $2 }'"); 
      $version = shell_exec("sudo $webroot/scripts/get_version $path 2 2>&1"); 
     default: 
      echo "error"; 
    } 

    return $version; 
} 

正如你所看到的,我打電話給我的bash腳本傳遞了兩個參數。

#!/bin/bash 

_x="" 
_programm=$1 
_nr=$2 

if [ "$_nr" -eq "1" ] ; then 
    _x=$($_programm -v 2>/dev/null | grep -i 'version' | awk -F/ '{ print $4 }') 
elif [ "$_nr" -eq "2" ] ; then 
    _x=$($_programm -v 2>&1 | awk -F/ '{ print $2 }') 
fi 

cd $(pwd) 
echo $_x 

的功能輸出:

get_version("apache");  OUTPUT:  sh: 2: 1: not found 
get_version("nginx");  OUTPUT:  sh: 2: 2: not found 

但如果我執行終端的bash腳本,然後它和我得到的,我在我的bash腳本使用的路徑和一個整數版本號作爲輸出,我試着用戶rootwww-data,都工作。 bash腳本也輸入到visudo文件中並具有執行權限,腳本的用戶是www-data。

./get_version /usr/sbin/apachectl 1  OUTPUT: 2.2.2 
./get_version /usr/sbin/nginx 2   OUTPUT: 1.3 

有人可以請解釋爲什麼它在終端工作,但不是在PHP?

+1

不應該在'print $ 2'的雙引號中反斜線'$'? – choroba

+0

你的意思是這樣的:'print \ $ 2'?我嘗試過,但後來我得到語法錯誤。 – Black

回答

2

我發現的問題和解決方案。在我的php switch語句中,命令whereis由於某種未知原因爲路徑變量寫了一個空格字符,所以它沒有正常工作。我在我的$path變量上使用了rtrim來修復它。

case "apache": 
     $path = shell_exec("whereis apachectl | awk '{ print $2 }'"); 
     $path = rtrim($path); 
     ... 
+1

它現在可以工作嗎?還要注意,你收到的錯誤信息,不是由'bash'產生的,而是由'sh'產生的。 – user1934428

+0

是的,它現在按預期工作。 – Black

1

你,如果你正在使用它在PHP或交換機雙引號裏面的單引號逃逸$

... 
$path = shell_exec('whereis apachectl | awk \'{ print $2 }\''); 
... 
$path = shell_exec('whereis nginx | awk \'{ print $2 }\''); 
+0

嗯。我用你的代碼,但不幸的是我仍然得到相同的錯誤。我也認爲這與我的代碼沒有區別。 – Black

+0

請爲'$ path'和'$ version'字符串添加調試輸出,並在您的問題中發帖。 'echo $路徑。 「\ n」。 $ version;'break'語句之前。 – maxhb

+0

我得到'/ usr/sbin/apachectl' +'sh:2:1:not found'和'/ usr/sbin/nginx' +'sh:2:2:not found' – Black