Bash剥离传递给java命令行应用程序的引号



我有一个使用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子命令有一个名为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}

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

最新更新