試す
export JAVA_OPTS="... \"-XX:OnError=$TEMP_CMD\" ..."
また
export JAVA_OPTS='... "-XX:OnError=$TEMP_CMD" ...'
Bash のネストされた引用符と evalおよびhttp://www.grymoire.com/Unix/Quote.htmlを参照してください。
アップデート
上記は、テスト後もまだ機能しないようです。
test.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 変数置換と単語分割規則の奇妙な組み合わせにあることを Google に知らせました: 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