ตอนนี้ฉันอยู่ภายใต้ไดเรกทอรีที่มีเส้นทางที่ยาวมาก สำหรับการเยี่ยมชมในอนาคตนั้นเร็วกว่าฉันต้องการสร้างลิงก์ให้
ฉันเหนื่อย
ln -s . ~/mylink
~/mylinkเชื่อมโยงไปยัง~จริง ฉันจะขยาย~เข้าไปในชื่อพา ธ ที่ล้าสมัยแล้วให้มันได้lnหรือไม่
ตอนนี้ฉันอยู่ภายใต้ไดเรกทอรีที่มีเส้นทางที่ยาวมาก สำหรับการเยี่ยมชมในอนาคตนั้นเร็วกว่าฉันต้องการสร้างลิงก์ให้
ฉันเหนื่อย
ln -s . ~/mylink
~/mylinkเชื่อมโยงไปยัง~จริง ฉันจะขยาย~เข้าไปในชื่อพา ธ ที่ล้าสมัยแล้วให้มันได้lnหรือไม่
คำตอบ:
symlink จัดเก็บเส้นทางที่คุณให้ตามตัวอักษรเป็นสตริง actually นั่นหมายความว่าลิงก์ของคุณ~/mylinkมี " ." (หนึ่งตัวอักษร) เมื่อคุณเข้าถึงลิงก์เส้นทางนั้นจะถูกตีความโดยสัมพันธ์กับตำแหน่งของลิงก์ไม่ใช่ตำแหน่งที่คุณอยู่เมื่อคุณสร้างลิงก์
คุณสามารถเก็บเส้นทางที่แท้จริงที่คุณต้องการในลิงค์แทนได้
ln -s "$(pwd)" ~/mylink
ใช้การทดแทนคำสั่งเพื่อใส่ผลลัพธ์ของpwd(ชื่อไดเรกทอรีทำงาน) ลงในบรรทัดคำสั่งของคุณ lnเห็นเส้นทางแบบเต็มและเก็บไว้ใน symlink ของคุณซึ่งจะชี้ไปยังตำแหน่งที่ถูกต้อง
¹ มากหรือน้อย
คุณควรใช้:
ln -s "$(cd . && pwd)" ~/mylink
หรือ:
ln -s "$(pwd -P)" ~/mylink
เพื่อให้ได้ผลลัพธ์ที่ถูกต้องสำหรับไดเรกทอรีการทำงานปัจจุบัน สามารถเปลี่ยนแปลงได้ในขณะที่คุณกำลังทำงานอยู่เหมือนในคำถามนี้
$PWD(เส้นทางที่เขาใช้เพื่อไปที่นั่น) มากกว่า$(pwd -P)(เส้นทางที่เป็นที่ยอมรับไปยังไดเรกทอรีปัจจุบัน) หาก$PWDไม่ได้ชี้ไปที่ไดเรกทอรีปัจจุบันอีกต่อไปก็ไม่มีการบอกว่า$(pwd -P)จะเกิดขึ้นในนาทีถัดไป
"$PWD"ยังมีค่าเดิมถ้าย้ายไดเรคอรี่ปัจจุบัน PWDตั้งค่าเฉพาะเมื่อคุณcdหรือเริ่มต้นโดยเปลือก
cdไม่ได้รับประกันว่าจะทำให้ $ PWD หรือผลลัพธ์ของ pwd เส้นทางไปยังไดเรกทอรีปัจจุบัน คุณกำลังพยายามป้องกันบางสิ่งที่ไม่น่าจะเกิดขึ้น แต่ในโซลูชันแรกนั่นไม่จำเป็นต้องมีประสิทธิภาพและในวินาทีที่เปลี่ยนพฤติกรรม
mv นั้นหลังจากที่คุณทำคุณจะต้องlnอยู่ในสถานการณ์เดียวกัน ในทางตรงกันข้ามถ้าเขาทำcd /long/logical/path/to/some/directoryคุณไม่ต้องการให้ลิงก์ชี้ไปที่/vg0/lv1/user2/app4(เส้นทางแบบบัญญัติ) เนื่องจากลิงก์จะชี้ไปยังตำแหน่งที่ผิดเมื่อ/long/logical/path/to/some/directoryชี้ไปที่อื่น
"$PWD"ในเปลือกหอย POSIX และใน~0zsh