Bash变量扩展导致Java命令行中断

pur*_*ger 1 java heap size bash

在编写执行Java的shell脚本(启动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 &
Run Code Online (Sandbox Code Playgroud)

执行此操作会给出以下内容:

Invalid initial heap size: -Xms512m -Xmx1024m
Could not create the Java virtual machine.
Run Code Online (Sandbox Code Playgroud)

但是,当我删除变量扩展时,如下所示:

    java "$SERVER" -Xms512m -Xmx1024m $JAVA_OPTS \
Run Code Online (Sandbox Code Playgroud)

java执行没有问题.顺便说一句,当我在MEM_OPTS var中包含"-server"时,我得到错误"无法识别的选项".

显然,变量扩展存在一些问题.我已经对脚本进行了hexdump,并确保字符串中没有多余的字符,并确认我使用的是Unix行结尾.我也在两台不同的linux机器上重现了这个问题,虽然它们都运行相同版本的ubuntu(一个32位,另一个64位).

编辑:我得到所有形式的变量替换相同的结果:$ MEM_OPTS,$ {MEM_OPTS},"$ {MEM_OPTS}"

有任何想法吗?

Zoo*_*ork 7

当您使用时"$MEM_OPTS",您将-Xms512m -Xmx1024m作为单一选项传递.

试试这个:

java "$SERVER" $MEM_OPTS $JAVA_OPTS \
Run Code Online (Sandbox Code Playgroud)

变量替换和引用的良好指南示例:http://tldp.org/LDP/abs/html/varsubn.html