外殼不膨脹*

外殼不膨脹*

我正在 bash 腳本中設定 java 類路徑。我認為我必須使用引號來防止 shell*根據這個問題擴展:https://stackoverflow.com/questions/219585/setting-multiple-jars-in-java-classpath,但以下內容在沒有引號的情況下也可以正常工作:

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

然而,shell 會對此進行擴展:

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

如果類別路徑變數中有多個目錄,看來我不用擔心 shell 擴充會弄亂我的 java 類別路徑?

答案1

classpath=是用於分配變數的 shell 語法,因此 shell 知道後面的內容可能是要擴展的路徑。這意味著,我們必須考慮/jars/*/jars/*:/anotherJarsDir/*。第一個具有目錄前綴和通配符,第二個被解釋為「名為 的目錄中的任何文件anotherJarsDir,在以冒號結尾的目錄中(這是*:),在該/jars目錄中。

請注意,shell 不知道冒號是路徑分隔符號;它將其解釋為目錄名稱的一部分。如果你有一個 file /jars/wx:/anotherJarsDir/yz,那麼你的路徑將與它匹配,但多個文件將用空格分隔,而不是用冒號分隔,而 java 又會將其解釋為一個/jars/wx文件和一個/anotherJarsDir/yz文件(假設這是唯一的文件,因此不會產生在類別路徑中的空格中)

結論:如果您想避免擴展,請引用您的字串,即使未加引號的字串在極端情況下也有效!

答案2

如果存在匹配,shell 只會擴展通配符。如果沒有檔案與該模式匹配,則會保留通配符。然而,Java 和 shell 對於該:字元的實際含義存在分歧。在類別路徑環境變數中,它用作不同項目之間的分隔符號。另一方面,shell 將其視為與其他字元一樣的有效目錄字元。第一個範例未擴展的唯一原因是因為/jars/*:/anotherJarsDir/*恰好不匹配任何目錄。如果儘管困難重重,您有一個名為 之類的目錄/jars/123:/anotherJarsDir/456,則通配符將被擴展以反映這一點。換句話說,一定要引用你的classpath定義。

相關內容