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

标签 java bash picocli

我有一个使用 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 是一个调用 java 的包装脚本,并且引号被该包装脚本删除。

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

您可以通过设置系统属性 -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}

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

关于java - Bash 去除传递给 java 命令行应用程序的引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61432574/

相关文章:

java - 在静态方法中使用 this.var 时出错,如果使用任何其他 var 名称,错误就会消失

java - 无法实例化类...;没有空的构造函数

linux - 如何使用 ls 和 AWK 打印文件/目录详细信息?

bash - 新手如何在 Heroku bash 中查看和编辑文件?

spring-boot - 如何将 Picocli 解析参数注入(inject) Spring Bean 定义?

java - 解析多个 picocli(子)命令和 shell

java - Picocli,如何识别具有可选值和自定义类型转换器的选项的存在

java - 如何正确拆分类(OOP)?

Python webdriver 脚本可以从控制台运行,但不会作为 Upstart 服务启动

java - 如何将Keycloak设置为Eclipse Hono的身份验证服务提供者(OIDC)?