
Estoy configurando un classpath de Java en un script bash. Pensé que tendría que usar comillas para evitar que Shell expandiera *
según esta pregunta:https://stackoverflow.com/questions/219585/setting-multiple-jars-in-java-classpath, pero lo siguiente funciona bien sin comillas:
classpath=/jars/*:/anotherJarsDir/*
java -classpath=$classpath com.test.MyClass
Sin embargo, Shell expandirá esto:
classpath=/jars/*
java -classpath=$classpath com.test.MyClass
¿Parece que no tengo que preocuparme de que la expansión del shell arruine mi classpath de Java si hay varios directorios en la variable classpath?
Respuesta1
classpath=
es la sintaxis del shell para asignar una variable, por lo que el shell sabe que lo que sigue puede ser una ruta para expandirse. eso significa que tenemos que mirar /jars/*
y /jars/*:/anotherJarsDir/*
. el primero tiene un prefijo de directorio y un comodín, el segundo se interpreta como "cualquier archivo en un directorio llamado anotherJarsDir
, en un directorio que termina en dos puntos (este es *:
), en el /jars
directorio.
Tenga en cuenta que el shell no sabe que los dos puntos son un separador de ruta; lo interpreta como parte del nombre del directorio. Si tuviera un archivo /jars/wx:/anotherJarsDir/yz
, entonces su ruta coincidiría con eso, pero varios archivos estarían separados por espacios, no por dos puntos, y Java a su vez lo interpretaría como un /jars/wx
archivo y un /anotherJarsDir/yz
archivo (suponiendo que este sea el único archivo, por lo que no resultaría en espacios en tu classpath)
Conclusión: si desea evitar la expansión, componga sus cadenas, ¡incluso si una cadena sin comillas funciona en casos extremos!
Respuesta2
El shell sólo expandirá los comodines si hay coincidencias. Si ningún archivo coincide con el patrón, se conservará el comodín. Sin embargo, Java y el shell no están de acuerdo sobre lo que :
realmente significa el carácter. En la variable de entorno classpath, se utiliza como separador entre diferentes elementos. El shell, por otro lado, lo considera un carácter de directorio válido como cualquier otro. La única razón por la que el primer ejemplo no se expande es porque /jars/*:/anotherJarsDir/*
no coincide con ningún directorio. Si, contra todo pronóstico, tuviera un directorio llamado algo así como /jars/123:/anotherJarsDir/456
, los comodines se expandirían para reflejar esto. En otras palabras, cite siempre su classpath
definición.