【问题标题】:Bash strips quotes passed to java command line applicationBash 去除传递给 java 命令行应用程序的引号
【发布时间】:2020-04-25 21:03:13
【问题描述】:

我有一个使用 Picocli 编写的 java 命令行应用程序,我试图向它传递一个字符串参数,但每次我尝试 bash 时都会去掉引号并以三个参数结束。

javaCLI install "Extras lib v0.1.4.cpkg"

这是我在 bash 中收到的输出

positional parameter at index 0..* (package_file) should be specified only once
Usage: javaCLI install package_file

我尝试使用转义单引号 (\') 和双引号 (\")、转义空格 (\),甚至同时使用单引号和双引号(带和不带 ),但它们都不起作用。简单的解决方案是重命名打包到 extras_lib_v0.1.4.cpkg 但我用其他方法也会遇到同样的问题。

【问题讨论】:

  • 什么是“javaCli”?您自己编写的 shell 脚本?
  • javaCli install Extras*.cpkg(如果你不能打败他们,加入他们)。你也可以试试find . -name "*.cpkg" -exec javaCli install {} \;
  • 您希望将双引号传递给 java 应用程序,还是仅使用它们作为分隔符?
  • 我打赌问题不在bash 而是在javaCli,所以我加入了第一条评论的问题:javaCli 是什么?
  • 如果没有帮助,错误信息是正确和准确的。 “用法:javaCLI”你使用过javaCli。投票结束是错字。

标签: java bash picocli


【解决方案1】:

我的猜测是 javaCLI 是一个调用 java 的包装脚本,并且引号被这个包装脚本剥离。

错误消息“索引 0..* (package_file) 处的位置参数应仅指定一次”告诉我 install 子命令有一个名为 package_file@Parameters 注释字符串字段,因此它期望只有一个位置参数,但被多个参数调用。

您可以通过设置系统属性-Dpicocli.trace=DEBUG 来确认 java 应用程序错误地接收了 4 个参数而不是所需的 2 个参数。这将导致 picocli 打印一些详细信息,包括它收到的确切命令行参数。

我猜javaCLI 包装脚本传递的参数是这样的:

java -cp myjar.jar:picocli-4.2.0.jar com.xxx.MainClass $@

如果是这种情况,可以通过确保在将参数传递给 java 可执行文件时保留引号来解决问题。感谢https://stackoverflow.com/a/39463371/1446916 提出使用printf 保留引号的想法:

# attempt to ensure each argument keeps its original quoting
ARGS=$( printf "%q " "$@" )

java -cp myjar.jar:picocli-4.2.0.jar com.xxx.MainClass ${ARGS}

如果我的猜测不正确,请在问题中提供更多详细信息。

【讨论】:

  • @pyserial-killer 我用一个新想法更新了我的答案:在调用java 时使用printf 保留引号。
猜你喜欢
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
相关资源
最近更新 更多