3

Мне нужно создать скрипт-обертку для интерпретатора PHP (уже в PATH):

#!/bin/bash
# This is a wrapper for the PHP interpreter.
#
# We prepare the enviroment for SQL Anywhere PHP extension sourcing
# /opt/sqlanywhere17/bin64/sa_config.sh and then we call the PHP
# interpreter already in the PATH passing -dextension=sqlanywere.so which
# enable the PHP extension.
#
# Don't enable sqlanywhere.so globally becase for some reason this will
# break the command "plesk bin php_handler". In addition the extension
# requires the SQLANY17 environment variable which is hard to set with
# CGI/FastCGI at this time.
php $@

Однако моя php-wrapper не работает должным образом с кавычками. Например, это работает с оригинальным интерпретатором:

php-r 'echo "Works";'

Запуск php-wrapper с такими же аргументами:

./php-wrapper -r 'echo "Works";'

Ошибка синтаксического анализа PHP: синтаксическая ошибка, неожиданный конец файла в коде командной строки в строке 1

Как я могу отладить аргументы $@ чтобы увидеть, что происходит, и как я могу решить эту проблему?

1 ответ1

3

Оберните ваш $@ в двойные кавычки, таким образом:

php "$@"

Что происходит, так это то, что аргументам php-wrapper являются -r и echo "Works"; что хорошо Однако, поскольку $@ не заключен в кавычки, все полученные аргументы php-wrapper анализируются как отдельные слова, поэтому php передается в виде -r , echo и "Works" . С двойными кавычками $@ , php будет передан -r и echo "Works" .

Со страницы руководства bash :

   @      Expands to the positional parameters, starting from  one.   When
          the  expansion  occurs  within  double  quotes,  each  parameter
          expands to a separate word.  That is, "$@" is equivalent to "$1"
          "$2"  ...

Вот небольшой скрипт, который я использую, когда разбор аргументов происходит не так, как я хочу:

$ cat echoargs
#!/bin/bash --

count=0

for i in "$@"
do
    echo "$count: $i"

    ((count++));
done

Измените ваш скрипт обёртки на:

echoargs $@
echo ====
echoargs "$@"

а затем попробуйте различные вызовы оболочки, чтобы увидеть, что она передает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .