我编写了一个 bash 脚本,它正在执行.jar
带有一些选项的文件。令人惊讶的是,我发现使用不同方法的变量会导致不同的行为。
用法一:
JAR_FILE="my_jar_file.jar"
JAVA_OPTS="-mx4096M"
GC_OPTS="-XX:+UseG1GC"
echo "java "$GC_OPTS" "$JAVA_OPTS" -jar "$JAR_FILE
java $GC_OPTS $JAVA_OPTS -jar $JAR_FILE
这是它的执行方式:
java -XX:+UseG1GC -mx4096M -jar my_jar_file.jar
用法2:
JAR_FILE="my_jar_file.jar"
JAVA_OPTS="-mx4096M"
GC_OPTS="-XX:+UseG1GC"
echo "java "${GC_OPTS}" "${JAVA_OPTS}" -jar "${JAR_FILE}
java ${GC_OPTS} ${JAVA_OPTS} -jar ${JAR_FILE}
这是它的执行方式:
java -XX:+UseG1GC -Xmx3072m -XX:MaxPermSize=1024m -Djava.net.preferIPv4Stack=true -jar my_jar_file.jar
这些中间选项从哪里来?
编辑:
我犯了一个错误。中间有一个java构建步骤,我之前没有注意到。该构建替换了变量,差异就在那里。因此,正如@Kusalananda 所说,${VAR}
和用法之间没有区别$VAR
。
我想我应该提出一个新问题并询问java专家为什么变量替换会这样工作。
答案1
假设这实际上是在 shell 脚本中而不是在 Makefile 之类的东西中......
$variable
和之间的外壳绝对没有区别${variable}
。它们是可以互换的。
${variable}
如果要将其扩展为字符串的一部分并且紧随其后的字符是作为变量名称的一部分有效的字符(例如 中的),则可以使用它"${variable}A"
。
因此,使用${variable}
并不能解释您所看到的差异。
唯一可以确定的是,JAVA_OPTS
在第二次调用中似乎具有不同的值。