1

我有一个使用 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 但其他方法也会有同样的问题。

4

1 回答 1

2

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

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

您可以通过设置 system property 来确认 java 应用程序错误地接收了 4 个参数而不是所需的 2 个-Dpicocli.trace=DEBUG。这将导致 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}

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

于 2020-04-26T12:35:09.457 回答