Primeiro, observe que args
mostrará dois argumentos, mesmo se você der apenas um:
$ args "abc def"
1 : <abc> <def>
Para que seja exibido corretamente, é necessário adicionar aspas duplas:
$ function args() { printf "%d :" $#; printf " <%s> " "$@"; echo; }
$ args "abc def"
1 : <abc def>
No entanto, ainda existem problemas com a definição de JAVA_OPTS
. Observe:
$ args $JAVA_OPTS
3 : <-Xmx1g> <-XX:OnError='/path/to/a/script.sh> <%p'>
Isso ocorre porque, quando $JAVA_OPTS
aparece em uma linha de comando, o shell fará a divisão de palavras no conteúdo de JAVA_OPTS, mas não respeitará nem processará as aspas contidas nele.
Para este tipo de aplicativo, você está muito melhor com JAVA_OPTS definido como um array bash:
$ JAVA_OPTS="-Xmx1g"
$ JAVA_OPTS=("$JAVA_OPTS" "-XX:OnError=/path/to/a/script.sh %p")
$ args "${JAVA_OPTS[@]}"
2 : <-Xmx1g> <-XX:OnError=/path/to/a/script.sh %p>
A propósito, ao trabalhar com arrays, uma maneira prática de ver o que está neles é com declare -p
:
$ declare -p JAVA_OPTS
declare -a JAVA_OPTS='([0]="-Xmx1g" [1]="-XX:OnError=/path/to/a/script.sh %p")'