Shell não está se expandindo *

0

Estou configurando um classpath java em um script bash. Eu pensei que eu teria que usar aspas para impedir o shell de expandir o * com base nesta pergunta: link , mas o seguinte funciona muito bem sem aspas:

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

No entanto, o shell expandirá isso:

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

Parece que não tenho que me preocupar com a expansão do shell bagunçando meu classpath java se houver vários diretórios na variável classpath?

    
por yellavon 03.03.2014 / 15:27

2 respostas

1

classpath= é a sintaxe da shell para atribuir uma variável, então o shell sabe que a coisa depois pode ser um caminho para expandir. isso significa que temos que olhar para /jars/* e /jars/*:/anotherJarsDir/* . o primeiro tem um prefixo de diretório e um caractere curinga, o segundo é interpretado como "qualquer arquivo em um diretório chamado anotherJarsDir , em um diretório que termina em dois pontos (este é o *: ), no diretório /jars .

Observe que o shell não está ciente de que o cólon é um separador de caminho; ele interpreta como parte do nome do diretório. Se você tivesse um arquivo /jars/wx:/anotherJarsDir/yz , seu caminho corresponderia a isso, mas vários arquivos seriam separados por espaços, não por dois-pontos, e o java por sua vez interpretaria isso como um arquivo /jars/wx e /anotherJarsDir/yz (supondo este é o único arquivo, não resultando em espaços no seu classpath)

Conclusão: se você quiser evitar a expansão, cite suas strings, mesmo que uma string sem aspas funcione em casos de canto!

    
por 03.03.2014 / 15:41
0

O shell só expandirá curingas se houver correspondências. Se nenhum arquivo corresponder ao padrão, o curinga será preservado. No entanto, Java e o shell não concordam com o que o caractere : realmente significa. Na variável de ambiente classpath, é usado como um separador entre itens diferentes. O shell, por outro lado, considera um caractere de diretório válido como qualquer outro. A única razão pela qual o primeiro exemplo não se expande é porque /jars/*:/anotherJarsDir/* não corresponde a nenhum diretório. Se, contra todas as probabilidades, você tivesse um diretório chamado algo como /jars/123:/anotherJarsDir/456 , os curingas seriam expandidos para refletir isso. Em outras palavras, sempre cite sua definição classpath .

    
por 03.03.2014 / 15:44