Я устанавливаю путь к классу Java в сценарии bash. Я думал, что мне придется использовать кавычки, чтобы предотвратить расширение оболочки * на основе этого вопроса: https://stackoverflow.com/questions/219585/setting-multiple-jars-in-java-classpath, но следующее работает просто хорошо без кавычек:

classpath=/jars/*:/anotherJarsDir/*
java -classpath=$classpath com.test.MyClass

Однако оболочка расширит это:

classpath=/jars/*
java -classpath=$classpath com.test.MyClass

Кажется, мне не нужно беспокоиться о том, что расширение оболочки испортит мой путь к классу Java, если в переменной classpath есть несколько каталогов?

2 ответа2

1

classpath= - это синтаксис оболочки для назначения переменной, поэтому оболочка знает, что последующим может быть путь к расширению. это означает, что мы должны смотреть на /jars/* и /jars/*:/anotherJarsDir/* . первый из них имеет префикс каталога и подстановочный знак, второй интерпретируется как «любой файл в каталоге с именем anotherJarsDir , в каталоге, оканчивающемся двоеточием (это *: :), в каталоге /jars .

Обратите внимание, что оболочка не знает, что двоеточие является разделителем пути; он интерпретирует его как часть имени каталога. Если бы у вас был файл /jars/wx:/anotherJarsDir/yz , то ваш путь соответствовал бы этому, но несколько файлов были бы разделены пробелами, а не двоеточиями, а java, в свою очередь, интерпретировал бы его как файл /jars/wx и /anotherJarsDir/yz (при условии, что это единственный файл, поэтому в вашем пути к классам нет пробелов)

Вывод: если вы хотите избежать расширения, заключите в кавычки свои строки, даже если строка без кавычек работает в угловых случаях!

0

Оболочка будет расширять символы подстановки только при наличии совпадений. Если ни один файл не соответствует шаблону, подстановочный знак будет сохранен. Однако Java и оболочка не согласны с тем, что на самом деле означает символ : В переменной окружения classpath он используется как разделитель между различными элементами. Оболочка, с другой стороны, считает ее допустимым символом каталога, как и любой другой. Единственная причина, по которой первый пример не раскрывается, заключается в том, что /jars/*:/anotherJarsDir/* не соответствует ни одному каталогу. Если, несмотря ни на что, у вас будет каталог с именем что-то вроде /jars/123:/anotherJarsDir/456 , подстановочные знаки будут расширены для отражения этого. Другими словами, всегда указывайте свое определение classpath .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .