Java 将复杂命令放入变量中,并将其作为参数传递给另一个脚本,以便稍后运行

Java 将复杂命令放入变量中,并将其作为参数传递给另一个脚本,以便稍后运行,java,linux,shell,escaping,Java,Linux,Shell,Escaping,我有一个运行java二进制的脚本,希望传递一个复杂的命令,当OutOfMemoryException发生时将执行这个命令。问题更一般,与OOME无关。如何将命令放入变量中并将其传递给其他脚本(稍后将执行它)? 这就是我试图执行的代码。我尝试了不同的逃跑选择,但没有任何结果。在执行过程中,shell尝试在空格上拆分JAVA_选项,无论我如何转义它。 !/垃圾箱/垃圾箱 JAVA_OPTS="-Xmx10m" JAVA_OPTS="$JAVA_OPTS \"-XX:OnOutOfMemoryErro

我有一个运行java二进制的脚本,希望传递一个复杂的命令,当OutOfMemoryException发生时将执行这个命令。问题更一般,与OOME无关。如何将命令放入变量中并将其传递给其他脚本(稍后将执行它)? 这就是我试图执行的代码。我尝试了不同的逃跑选择,但没有任何结果。在执行过程中,shell尝试在空格上拆分JAVA_选项,无论我如何转义它。 !/垃圾箱/垃圾箱

JAVA_OPTS="-Xmx10m"
JAVA_OPTS="$JAVA_OPTS \"-XX:OnOutOfMemoryError=echo 'Ups'\""

set -x
java $JAVA_OPTS TestMemory
我发现这一点:,但没有一个涵盖的情况适用于我。我不能将此代码放入函数中,因为JVM进程将无法访问它。
当我把整个命令放在一行时,它工作得很好,但是我的用例有点不同,我不能修改最后一行。JAVA选项应该在其他地方构造,然后按照示例代码所示使用。

唯一明智的方法是使用bash数组或ksh/zsh

JAVA_OPTS=( "-Xmx10m" )
JAVA_OPTS+=( "-XX:OnOutOfMemoryError=echo 'Ups'" )

set -x
java "${JAVA_OPTS[@]}" TestMemory
试试这个

JAVA_OPTS="-Xmx10m"
read JAVA_OPTS<<eod
$JAVA_OPTS "-XX:OnOutOfMemoryError=echo 'Ups'
eod

set -x
java $JAVA_OPTS TestMemory
# you may need to change it slightly

引用它:java$java_选择TestMemoryThank your for your响应。不幸的是,我不能修改最后一行,因为它在另一个文件中,我无法控制它。当JAVA_选择包含其他内容时,添加引号也不起作用。请参阅修改后的示例。因为BashFAQ条目表明,不能将复杂的引号作为字符串变量进行引用。这是不可能做到的。您可以尝试使用eval来处理正确数量的引号删除,但这是在玩火。对于引号,它应该仍然可以工作,如果您可以提供一个代码来重现问题,那么我们可以对此进行研究,否则这是非常困难的。为此,请使用脚本而不是内联命令。这样你就可以避免引用/转义空格。谢谢你,遗憾的是,它也是这样做的。错误是:错误:找不到或无法加载主类-XX:OnAutofmemoryError=Echo谢谢您的评论。这确实有效,可能对很多人来说是一个有用的答案。不幸的是,我不能修改最后一行。JAVA_OPTS是在另一个文件中构造的,我只能修改那个文件。