【发布时间】:2014-11-03 18:59:07
【问题描述】:
我有一个运行 java 二进制文件的脚本,并且想要传递将在 OutOfMemoryException 发生时执行的复杂命令。问题更普遍,与 OOME 无关。如何将命令放入变量中并将其传递给稍后将执行的其他脚本? 这是我要执行的代码。我尝试了不同的转义选项,但没有任何结果。在执行期间,无论我如何转义,shell 都会尝试在空格上拆分 JAVA_OPTS。 #!/bin/sh
JAVA_OPTS="-Xmx10m"
JAVA_OPTS="$JAVA_OPTS \"-XX:OnOutOfMemoryError=echo 'Ups'\""
set -x
java $JAVA_OPTS TestMemory
我找到了这个:BashFAQ 050,但没有一个涵盖的案例适用于我。我不能将此代码放入函数中,因为 JVM 进程将无法访问它。 当我将整个命令放在一行时,它运行良好,但我的用例有点不同,我无法修改最后一行。 JAVA_OPTS 应该在其他地方构建,然后按照示例代码所示使用。
【问题讨论】:
-
引用它:
java "$JAVA_OPTS" TestMemory -
感谢您的回复。不幸的是,我无法修改最后一行,因为它位于不同的文件中,并且我无法控制它。当 JAVA_OPTS 还包含其他内容时,添加引号也不起作用。请看修改后的例子。
-
因为 BashFAQ 条目表明您不能将复杂的引用作为字符串变量。这是不可能的。您可以尝试使用
eval来处理恰到好处的引号删除,但这是在玩火。 -
带引号应该还是可以的,如果你能提供代码来重现问题,那么我们可以研究一下,否则非常困难。
-
为此使用脚本而不是内联命令。这样您就可以避免需要引用/转义空格。