Bash 去除传递给 java 命令行应用程序的引号

Bash strips quotes passed to java command line application

我有一个使用 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

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

我的猜测是 javaCLI 是一个调用 java 的包装脚本,引号被这个包装脚本去除了。

错误消息 "positional parameter at index 0..* (package_file) should be specified only once" 告诉我 install 子命令有一个名为 package_file@Parameters 注释字符串字段,因此它只需要一个位置参数, 但被调用时带有多个参数。

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

我猜测 javaCLI 包装器脚本会像这样传递参数:

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

如果是这种情况,可以通过确保在将参数传递给 java 可执行文件时保留引号来解决问题。感谢 for the idea of using 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}

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