【问题标题】:Put complex command into variable and pass as parameter to another script to run later [duplicate]将复杂的命令放入变量并作为参数传递给另一个脚本以便稍后运行[重复]
【发布时间】: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 来处理恰到好处的引号删除,但这是在玩火。
  • 带引号应该还是可以的,如果你能提供代码来重现问题,那么我们可以研究一下,否则非常困难。
  • 为此使用脚本而不是内联命令。这样您就可以避免需要引用/转义空格。

标签: java linux shell escaping


【解决方案1】:

做到这一点的唯一合理方法是使用 bash 数组(或 ksh/zsh)

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

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

【讨论】:

  • 感谢您的评论。这确实有效,可能对很多人都有帮助。不幸的是,我无法修改最后一行。 JAVA_OPTS 是在其他文件中构建的,我只能修改那个。
【解决方案2】:

试试这个

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

【讨论】:

  • 谢谢,遗憾的是它也是如此。错误是:错误:无法找到或加载主类“-XX:OnOutOfMemoryError=echo
猜你喜欢
  • 1970-01-01
  • 2018-10-16
  • 2014-02-24
  • 2022-12-08
  • 2020-06-21
  • 2013-08-27
  • 2019-09-07
  • 2021-05-16
  • 2015-01-21
相关资源
最近更新 更多