Я пытаюсь создать сценарий оболочки, в котором я хочу передать флаг -classpath "classpath-value" в команду javac. Я знаю, что я могу использовать переменную среды CLASSPATH для установки пути к классам, но мне очень нужно это делать.
То, что я хочу:
$ classpath_val="-classpath \"/opt/apache-tomcat-8.5.20/lib/servlet-api.jar\""
$ javac $classpath_val com/example/Test.java
Однако, когда я выполнил вторую команду, она просто выполняется, как если бы classpath_val не был предоставлен, поэтому он не использует -classpath flag.
Но если я повторяю ту же команду, я получаю: [ ! d3] $ echo javac $classpath_val com/example/Test.java
javac -classpath "/opt/apache-tomcat-8.5.20/lib/servlet-api.jar" com/example/Test.java
Что совершенно правильно.
Почему это происходит? Не могу ли я предоставить аргументы команде из значения переменной?
В bash, вероятно, самый надежный способ сделать это - использовать массив, например
classpath_val=("-classpath" "/opt/apache-tomcat-8.5.20/lib/servlet-api.jar")
, затем развернуть каждый элемент безопасным способом с помощью
javac "${classpath_val[@]}" com/example/Test.java
Цитирование элементов как в конструкции массива, так и в расширении предотвращает их разделение на пробелы. Для иллюстрации:
$ arr=("foo" "bar baz")
$ set -- "${arr[@]}"
$ for f; do echo "$f"; done
foo
bar baz
В bash, вероятно, самый надежный способ сделать это - использовать массив, например
classpath_val=("-classpath" "/opt/apache-tomcat-8.5.20/lib/servlet-api.jar")
, затем развернуть каждый элемент безопасным способом с помощью
javac "${classpath_val[@]}" com/example/Test.java
Цитирование элементов как в конструкции массива, так и в расширении предотвращает их разделение на пробелы. Для иллюстрации:
$ arr=("foo" "bar baz")
$ set -- "${arr[@]}"
$ for f; do echo "$f"; done
foo
bar baz
В bash, вероятно, самый надежный способ сделать это - использовать массив, например
classpath_val=("-classpath" "/opt/apache-tomcat-8.5.20/lib/servlet-api.jar")
, затем развернуть каждый элемент безопасным способом с помощью
javac "${classpath_val[@]}" com/example/Test.java
Цитирование элементов как в конструкции массива, так и в расширении предотвращает их разделение на пробелы. Для иллюстрации:
$ arr=("foo" "bar baz")
$ set -- "${arr[@]}"
$ for f; do echo "$f"; done
foo
bar baz