【问题标题】:Quotation marks in bash execbash exec中的引号
【发布时间】:2020-04-30 10:40:56
【问题描述】:

我想用exec 命令在bash 中启动一个应用程序。问题是启动应用程序的命令使用引号,并且不能包含重复的空格。

所以我尝试了以下代码:

START_CMD="java -jar DockerProcessWrapper.jar -execute \"java -Dlog4j.configurationFile=log4j.xml -jar server.jar\" -shutdown stop"
exec $(echo "$START_CMD" | tr -s " ")

这不起作用,应用程序抛出以下错误: org.kohsuke.args4j.CmdLineException: "-Dlog4j.configurationFile=log4j.xml" is not a valid option

我认为命令中的引号有问题。 但是如果我自己执行给定的命令,它就可以工作。我该如何解决?

【问题讨论】:

  • 使用参数数组而不是字符串。
  • 你是什么意思?你能举个例子吗?

标签: bash exec


【解决方案1】:

与其陷入逃避和引用地狱的兔子洞,不如使用一组参数。

start_command=(java -jar DockerProcessWrapper.jar
                    -execute "java -Dlog4j.configurationFile=log4j.xml -jar server.jar"
                    -shutdown stop)
exec "${start_command[@]}"

要从数组元素中删除重复的空格,可以使用 extglob 的替换参数扩展:

shopt -s extglob
exec "${start_command[@]//+( )/ }"

【讨论】:

  • 效果很好,但是如何删除数组中的重复空格?
  • 重复空格是什么意思?数组声明中未加引号的空格被 shell 解析掉,我在引号中看不到重复的空格。
  • 稍后在我的代码中,启动命令将包含其他变量,重要的是,启动命令中没有重复的空格。为此我使用了$(echo "$START_CMD" | tr -s " "),但我不知道如何使用数组来处理它。
  • @Dominic:你可以在shopt -s extglob下运行start_command=("${start_command[@]//+( )/ }")。
猜你喜欢
  • 2021-07-11
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2011-11-17
相关资源
最近更新 更多