Bash обрезает кавычки, переданные приложению командной строки java - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть приложение командной строки java, написанное с использованием Picocli, и я пытаюсь передать ему строковый параметр, но каждый раз, когда я пытаюсь 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

Я пытался использовать escape-одиночные (\ ') и двойные кавычки (\ "), escape-пробелы (\), даже оба одинарные и двойные кавычки (с и без), но ни одна из них не работает. Простое решение - переименовать пакет в extras_lib_v0.1.4.cpkg, но у меня будет такая же проблема с другими методами.

1 Ответ

1 голос
/ 26 апреля 2020

Я предполагаю, что javaCLI - это скрипт-обертка, который вызывает java, и что этот скрипт-обертка удаляет кавычки.

Сообщение об ошибке «позиционный параметр с индексом 0 .. * (файл_пакета) должен быть указан только один раз» говорит мне, что подкоманда install имеет одно @Parameters -аннотированное поле String с именем package_file, поэтому он ожидает только один позиционный параметр, но был вызван с несколькими параметрами.

Вы можете подтвердить, что приложение java неправильно получило 4 аргумента вместо желаемых 2, установив системное свойство -Dpicocli.trace=DEBUG. Это заставит picocli напечатать некоторые подробности, в том числе то, какие аргументы командной строки он получил.

Я предполагаю, что скрипт оболочки javaCLI передает параметры следующим образом:

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

Если в этом случае можно решить проблему, обеспечив сохранение кавычек при передаче аргументов в исполняемый файл java. Спасибо { ссылка } за идею использования 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}

Если мои предположения неверны, пожалуйста, предоставьте более подробную информацию в вопросе.

...