เชลล์ไม่ขยายตัว *


0

ฉันกำลังตั้งค่า classpath Java ในสคริปต์ทุบตี ฉันคิดว่าฉันจะต้องใช้เครื่องหมายคำพูดเพื่อป้องกันเชลล์ไม่ให้ขยาย*ตามคำถามนี้: 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

คำตอบ:


1

classpath=คือเชลล์ของไวยากรณ์สำหรับการกำหนดตัวแปรดังนั้นเชลล์รู้ว่าสิ่งที่ตามมาอาจเป็นพา ธ ที่จะขยาย นั่นหมายความว่าเราต้องมองไปที่และ/jars/* /jars/*:/anotherJarsDir/*อันแรกมีคำนำหน้าไดเรกทอรีและสัญลักษณ์แทนอันที่สองแปลเป็น "ไฟล์ใด ๆ ในไดเรกทอรีชื่อanotherJarsDirในไดเรกทอรีที่ลงท้ายด้วยโคลอน (นี่คือ*:) ใน/jarsไดเรกทอรี

โปรดทราบว่าเชลล์ไม่ทราบว่าโคลอนเป็นตัวคั่นพา ธ มันตีความมันเป็นส่วนหนึ่งของชื่อไดเรกทอรี หากคุณมีไฟล์/jars/wx:/anotherJarsDir/yzเส้นทางของคุณจะตรงกัน แต่หลายไฟล์จะถูกคั่นด้วยช่องว่างไม่ใช่โดยโคลอนและ java จะตีความว่าเป็น/jars/wxไฟล์และ/anotherJarsDir/yzไฟล์ (สมมติว่านี่เป็นไฟล์เดียวจึงไม่เกิด ในช่องว่างใน classpath ของคุณ)

สรุป: ถ้าคุณต้องการหลีกเลี่ยงการขยายให้พูดสตริงของคุณแม้ว่าสตริงที่ไม่มีเครื่องหมายจะทำงานในมุมตัวพิมพ์ใหญ่!


0

เชลล์จะขยายสัญลักษณ์แทนเฉพาะเมื่อมีการแข่งขัน หากไม่มีไฟล์ที่ตรงกับรูปแบบไวด์การ์ดจะถูกเก็บไว้ อย่างไรก็ตาม Java และเชลล์ไม่เห็นด้วยกับความ:หมายของอักขระ ในตัวแปรสภาพแวดล้อม classpath มันถูกใช้เป็นตัวคั่นระหว่างรายการที่แตกต่างกัน เชลล์ในทางกลับกันถือว่าเป็นอักขระไดเรกทอรีที่ถูกต้องเหมือนกัน เหตุผลเดียวที่ตัวอย่างแรกไม่ได้ขยาย/jars/*:/anotherJarsDir/*เกิดขึ้นเนื่องจากไม่ตรงกับไดเรกทอรีใด ๆ หากเทียบกับอัตราต่อรองทั้งหมดคุณจะมีไดเรกทอรีชื่อคล้าย/jars/123:/anotherJarsDir/456ๆ กันสัญลักษณ์แทนจะขยายออกเพื่อสะท้อนสิ่งนี้ พูดคำclasspathนิยามของคุณเสมอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.