linux — sh: 2: 1: not found — передать несколько аргументов php в скрипт bash

У меня есть простой скрипт 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 в терминале, то он работает, и я получаю номер версии в качестве вывода, я попробовал это как с пользователем root а также www-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

Решение

я нашел проблему и решение. Команда whereis в моем php switch оператор по неизвестной причине записал пробел в переменную path, поэтому он не работал из-за этого. я использовал rtrim на моем $path переменная, чтобы исправить это.

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

Другие решения

Ты должен сбежать $ если вы используете его внутри двойных кавычек в php или переключитесь на одинарные кавычки:

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

По вопросам рекламы [email protected]