为什么我的环境变量被错误地处理为 JVM 选项?

Why is my environment variable incorrectly processed as a JVM option?

我想在执行时使用环境变量作为 JVM 选项 java -jar

我要执行的命令:

java -XX:onOutOfMemory='echo test' -jar foo.jar

当我按原样运行上述命令时,jar 将运行。

(如果您没有 foo.jar,您将收到 Error: Unable to access jarfile foo.jar 错误。但这仍然意味着该选项被正确使用。

但是当我创建一个包含 JVM 选项的环境变量时,运行 命令使用该变量。

OOM="-XX:onOutOfMemory='echo test'"
java $OOM -jar foo.jar

比我得到以下错误:

Error: Could not find or load main class test'

java 命令似乎忽略了 'echo test' 周围的引号。

在查找类似问题后 on SO and on other websites,我尝试了各种使用引号的变体:

OOM="-XX:OnOutOfMemoryError=\"echo test\""
OOM='-XX:OnOutOfMemoryError="echo test"'
OOM=-XX:OnOutOfMemoryError="echo test"

但它们都会导致相同的错误。

An article from Oracle关于JVM选项,提到使用分号:

-XX:OnOutOfMemoryError="<cmd args>; <cmd args>"

但是分号的作用是分隔多个命令,而不是命令和参数。所以这不能解决我的问题。

有人知道如何正确地将 -XX:onOutOfMemory='echo test' 选项移动到环境变量中吗?

当运行java时,应该引用$OOM

示例:

java "$OOM" -jar foo.jar

请参阅 Unix stackexchange 上的 Why does my shell script choke on whitespace or other special characters? 了解为什么需要这样做。