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.