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

标签 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 中运行吗?

最佳答案

我找到了问题和解决方案。我的 php switch 语句中的命令 whereis 由于某种未知原因向路径变量写入了一个空格字符,因此它不起作用。我在 $path 变量上使用了 rtrim 来修复它。

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

关于php - sh: 2: 1: 未找到 - 将多个 php 参数传递给 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35127238/

相关文章:

linux - 在服务器部署中使用 shell 生成随 secret 码

linux - 如何将带引号的字符串作为参数传递给 bash 中的函数?

php - 在 SMS 应用程序中获取接收者的最后一条消息 - SQL 请求

linux - Ant 中的 Exec 命令只执行第一个命令

linux - 如何使用 grep 和 sed 打印多个字符串?

linux - Linux 中的汇编

php - 无法在 PHP5 中安装 PEAR

PHP-我如何获取所有 header 的列表

php - 我如何在 Joomla 3 中对逗号分隔的字段进行 MySQL 查询?

bash - ffmpeg/批量添加视频水印