Passar argumentos do script para o interpretador PHP não está funcionando com aspas, por quê?

3

Eu preciso criar um script wrapper para o interpretador PHP (já no 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 $@

Meu php-wrapper , no entanto, não está funcionando corretamente com as cotações. Por exemplo, isso funciona com o intérprete original:

php-r 'echo "Works";'

Executando php-wrapper com os mesmos argumentos:

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

PHP Parse error: syntax error, unexpected end of file in Command line code on line 1

Como posso depurar os argumentos $@ para ver o que está acontecendo e como posso resolver esse problema?

    
por user34295 11.01.2016 / 18:51

1 resposta

3

Quebra seu $@ entre aspas duplas, assim:

php "$@"

O que está acontecendo é que os argumentos para php-wrapper são -r e echo "Works"; , o que é bom. No entanto, como $@ não é citado, todos os argumentos php-wrapper receive são analisados como palavras separadas, portanto php está sendo passado -r , echo e "Works" . Com aspas duplas $@ , php serão passadas -r e echo "Works" .

Na página de manual 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"  ...

Aqui está um pequeno script que eu uso quando a análise de argumentos não está acontecendo do jeito que eu quero:

$ cat echoargs
#!/bin/bash --

count=0

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

    ((count++));
done

Altere seu script de wrapper para:

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

e tente várias invocações do wrapper para ver o que está passando.

    
por 11.01.2016 / 19:11