尝试
export JAVA_OPTS="... \"-XX:OnError=$TEMP_CMD\" ..."
或者
export JAVA_OPTS='... "-XX:OnError=$TEMP_CMD" ...'
请参阅Bash 嵌套引号和 eval以及http://www.grymoire.com/Unix/Quote.html。
更新
经过测试,以上似乎仍然无法正常工作。
测试.sh
JAVA_OPTS="$JAVA_OPTS -Xmx32m '-XX:OnOutOfMemoryError=echo %p'"
java $JAVA_OPTS Test
给
$ bash -x ./test.sh
+ JAVA_OPTS=' -Xmx32m '\''-XX:OnOutOfMemoryError=echo %p'\'''
+ java -Xmx32m ''\''-XX:OnOutOfMemoryError=echo' '%p'\''' Test
Exception in thread "main" java.lang.NoClassDefFoundError: '-XX:OnOutOfMemoryError=echo
失败。
JAVA_OPTS="$JAVA_OPTS -Xmx32m -XX:OnOutOfMemoryError=\"echo %p\""
java $JAVA_OPTS Test
给
$ bash -x ./test.sh
+ JAVA_OPTS=' -Xmx32m -XX:OnOutOfMemoryError="echo %p"'
+ java -Xmx32m '-XX:OnOutOfMemoryError="echo' '%p"' Test
Exception in thread "main" java.lang.NoClassDefFoundError: %p"
失败。
使用 bash 选项进行诊断-x
有助于谷歌搜索问题的根源在于 bash 变量替换和分词规则的奇怪组合:http: //mywiki.wooledge.org/BashFAQ/050。
有几种可能的解决方法。
1)使用帮助脚本摆脱顽固的空间
JAVA_OPTS+=" -Xmx32m -XX:OnOutOfMemoryError=/usr/tmp/test/oom.sh"
java $JAVA_OPTS Test
2)OnOutOfMemoryError
移出变量
JAVA_OPTS="$JAVA_OPTS -Xmx32m"
java $JAVA_OPTS -XX:OnOutOfMemoryError="echo %p" Test
给
$ bash -x ./test.sh
+ JAVA_OPTS=' -Xmx32m'
+ /usr/java/jdk1.6.0_16/bin/java -Xmx32m '-XX:OnOutOfMemoryError=echo %p' Test
#
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="echo %p"
# Executing /bin/sh -c "echo 1639"...
1639