sh:2:1:找不到 - 将多个php参数传递给bash脚本

时间:2016-02-01 09:42:29

标签: php linux bash shell sh

我有一个简单的bash脚本,我从我的php代码中调用,找出我的apache和nginx的版本。

$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脚本。我在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脚本,那么它可以工作,我得到版本号作为输出,我尝试了用户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中工作吗?

2 个答案:

答案 0 :(得分:2)

我发现了问题和解决方案。由于某些未知原因,我的php switch语句中的命令whereis为路径变量写了一个空格字符,因此它没有用。我在rtrim变量上使用$path来修复它。

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

答案 1 :(得分:1)

如果你在php中的双引号内使用它或者切换到单引号,你必须转义$

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