В последние пару дней я испытывал странную проблему при написании сценария оболочки, который выполняет Java (начиная с JBoss AS). У меня есть переменная JAVA_OPTS, которую я создаю и, наконец, передаю в команду 'java'. Когда я жестко кодирую значения в JAVA_OPTS, а не использую расширение переменных, процесс java выполняется нормально. Когда я использую расширение переменных, я получаю ошибки из исполняемого файла Java. Вот соответствующие части скрипта:
SERVER="-server"
MEM_OPTS="-Xms512m -Xmx1024m"
case "$1" in
start)
java "$SERVER" "$MEM_OPTS" $JAVA_OPTS \
-classpath "${JBOSS_CLASSPATH}" \
-Dorg.jboss.resolver.warning=true \
-Dsun.rmi.dgc.client.gcInterval=3600000 \
-Dsun.rmi.dgc.server.gcInterval=3600000 \
-Djboss.server.name=${SERVICE_NAME} \
-Djboss.server.base.dir=`dirname ${EC_APP_HOME}` \
-Djboss.server.base.url=file://`dirname ${EC_APP_HOME}` \
-Djboss.server.home.dir=${EC_APP_HOME} \
-Djboss.server.home.url=file://${EC_APP_HOME} \
org.jboss.Main >> out.log 2>&1 &
Выполнение этого дает следующее:
Invalid initial heap size: -Xms512m -Xmx1024m
Could not create the Java virtual machine.
Однако, когда я удаляю расширение переменной примерно так:
java "$SERVER" -Xms512m -Xmx1024m $JAVA_OPTS \
Java не выполняет никаких проблем. Кроме того, когда я включаю "-server" в переменную MEM_OPTS, я получаю ошибку "нераспознанная опция".
Итак, очевидно, что с расширением переменной что-то не так. Я hexdump'd сценарий, и убедился, что в строке нет лишних символов, и убедился, что я использую окончания строки Unix. Я также воспроизвел проблему на двух разных машинах linux, хотя обе они используют одну и ту же версию ubuntu (одна 32-битная, другая 64-битная).
РЕДАКТИРОВАТЬ: я получаю тот же результат со всеми формами подстановки переменных: $ MEM_OPTS, $ {MEM_OPTS}, "$ {MEM_OPTS}"
Есть идеи?