ฉันพยายามค้นหาตำแหน่ง java ของฉันภายในระบบ Linux และได้รับสิ่งนี้
[980@b449 ~]$ which java
/usr/bin/java
[980@b449 ~]$ readlink -f $(which java)
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
ความแตกต่างระหว่าง 2 คำสั่งคืออะไร?
ฉันพยายามค้นหาตำแหน่ง java ของฉันภายในระบบ Linux และได้รับสิ่งนี้
[980@b449 ~]$ which java
/usr/bin/java
[980@b449 ~]$ readlink -f $(which java)
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
ความแตกต่างระหว่าง 2 คำสั่งคืออะไร?
คำตอบ:
คำสั่งที่ 2?
/usr/bin/java
เป็นลิงก์อ่อน (สัญลักษณ์) ไปที่/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
ไม่มีความแตกต่างเนื่องจากเป็นไฟล์เดียวกัน
หากคุณพิมพ์สิ่งที่ชอบ
ls -l /usr/bin/java
คุณอาจได้รับผลลัพธ์เช่น:
lrwxrwxrwx. 1 root root 22 Aug 5 17:01 /usr/bin/java -> /etc/alternatives/java
ซึ่งหมายความว่าคุณสามารถมีจาวาเวอร์ชันต่าง ๆ ในระบบของคุณและใช้ทางเลือกเพื่อเปลี่ยนค่าเริ่มต้น มิฉะนั้นคุณสามารถเพิ่มและลบลิงค์เพื่อเปลี่ยนค่าเริ่มต้นด้วยตนเอง
เพื่อสร้างลิงค์สัญลักษณ์ใช้คำสั่ง
ln -s /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java /usr/bin/java
หรือในรูปแบบทั่วไป
ln -s <original file> <link to file>
และใช้rm
เพื่อลบลิงก์เช่นเดียวกับที่คุณลบไฟล์อื่น ๆ
กำหนดเส้นทางให้เป็นมาตรฐานโดยติดตามทุก symlink ในทุกองค์ประกอบของชื่อที่กำหนดซ้ำ ทั้งหมดยกเว้นองค์ประกอบสุดท้ายจะต้องมีอยู่
สำหรับไฟล์เรียกทำงานหรือสคริปต์ในไดเรกทอรีที่แสดงรายการในตัวแปรสภาพแวดล้อม PATH โดยใช้อัลกอริทึมเช่นเดียวกับ bash (1)
which
ไม่สนใจว่าสิ่งที่พบนั้นเป็น symlink หรือไม่: เพียงแค่ใช้งานได้ มันรับประกันว่าเส้นทางที่พิมพ์จะอยู่ในไดเรกทอรีใดไดเรกทอรีPATH
หนึ่งเสมอ
ในระบบของคุณ/usr/bin/java
เป็นsymlink/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
ไป เมื่อคุณรวมคำสั่งทั้งสองเข้าด้วยกันเช่นนี้คุณจะแทนที่เอาต์พุตของwhich
ลงในบรรทัดคำสั่งของreadlink -f
เพื่อสร้าง:
readlink -f /usr/bin/java
นั่นคือการwhich
ได้พบที่แฟ้มที่ปฏิบัติการครั้งแรกเรียกว่าjava
อยู่ในของคุณและเปลือกได้แทรกเส้นทางที่เป็นอาร์กิวเมนต์ไปยังPATH
จากนั้นค้นหาพา ธ และพบว่าเป็นลิงก์สัญลักษณ์ดังนั้นจึงสามารถแก้ไขลิงก์นั้น (และอื่น ๆ ที่พบ) เพื่อสร้างพา ธ โดยตรงที่สมบูรณ์ไปยังไฟล์จริงreadlink -f
readlink
สำหรับวัตถุประสงค์เกือบทั้งหมดเส้นทางเหล่านี้จะใช้แทนกันได้ - symlink java
จะได้รับการแก้ไขให้เป็นเส้นทางจริงโดยอัตโนมัติเมื่อคุณใช้งานและการแก้ไขไฟล์จะถูกทำโดยผู้จัดการแพ็คเกจของคุณแทนที่จะเป็นคุณดังนั้นคุณจึงไม่เคยมี เพื่อดูมัน คุณสามารถเรียกใช้โปรแกรมจากเส้นทางใดเส้นทางหนึ่งหรือเพียงแค่java
และผลลัพธ์ก็จะเหมือนกันทุกประการเพราะเป็นไฟล์ปฏิบัติการจริงที่ทำงานในตอนท้าย
ตัวจัดการแพ็กเกจจะใช้ symlink แทนที่จะวางไฟล์จริงไว้ภายใน/usr/bin
เพราะ JRE มีไฟล์ทั้งชุดซึ่งมันชอบที่จะอยู่ติดกันในการกำหนดค่าที่ผิดปกติและ symlink ช่วยให้ตัวจัดการแพคเกจนำเสนอการจัดการที่ดูเป็นปกติ คุณในฐานะผู้ใช้ จะมีไฟล์อื่น ๆ อีกมากมาย/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64
ที่คุณไม่เคยมีเหตุผลที่จะจัดการและจะไม่มีส่วนร่วมในการจัดเรียงไลบรารีปกติของระบบ
คำสั่งบรรทัดเดียวนี้:
which java | xargs readlink -f
จะทำงานให้คุณ
which java
ให้เช่น: /usr/bin/java
readlink -f
ผ่านการเชื่อมโยงสัญลักษณ์ทั้งหมด/usr/bin/java
-> /etc/alternatives/java
-> /usr/lib/jvm/java-8-oracle/jre/bin/java
และส่งคืนลิงก์ล่าสุด