วิธีแก้ไขลิงก์สัญลักษณ์ใน Shell Script

การทำงานกับลิงก์สัญลักษณ์ (หรือ symlinks) ในระบบ Unix-like บางครั้งอาจจะยุ่งยาก โดยเฉพาะเมื่อคุณต้องการทราบเส้นทางจริงที่ลิงก์สัญลักษณ์ชี้ไป ในกรณีที่คุณกำลังเขียน Shell Script และต้องการกำหนดเส้นทางทั้งหมดของเป้าหมายหลังจากแก้ไข symlinks ชั่วคราว คุณมาถูกที่แล้ว ในโพสต์บล็อกนี้เราจะอธิบายวิธีการทำสิ่งนี้อย่างมีประสิทธิภาพ

เข้าใจปัญหา

สมมุติว่าคุณมีสถานการณ์ที่คุณมีลิงก์สัญลักษณ์ foo ที่ชี้ไปยังไดเร็กทอรีอื่น bar เมื่อคุณรันคำสั่งเช่น cd foo และ pwd เชลล์ของคุณอาจไม่เปิดเผยโครงสร้างด้านล่างอย่างชัดเจน ทำให้ยากที่จะอนุมานเส้นทางทั้งหมดไปยังเป้าหมาย

ตัวอย่างเช่น:

ls -ld foo bar
drwxr-xr-x   2 greg  greg  68 Aug 11 22:36 bar
lrwxr-xr-x   1 greg  greg   3 Aug 11 22:36 foo -> bar

หากคุณทำการเรียกใช้:

cd foo
pwd

ผลลัพธ์จะเป็น /Users/greg/tmp/foo ซึ่งไม่ช่วยอะไรหากเป้าหมายของคุณคือการค้นหาเส้นทางจริงที่ foo ชี้ไป ซึ่งคือ /Users/greg/tmp/bar

วิธีแก้ไข

โชคดีที่มีคำสั่งที่รวมอยู่ในระบบซึ่งสามารถช่วยให้คุณแก้ไข symlinks ใน Shell Script ได้โดยไม่ต้องลุยเข้าไปในโปรแกรม C นี่คือวิธีการทำ:

การใช้คำสั่ง pwd

คำสั่ง pwd -P ใช้สำหรับพิมพ์ไดเร็กทอรีทำงานปัจจุบัน โดยการแก้ไข symlinks ทั้งหมดเพื่อให้เส้นทางที่แท้จริงของเป้าหมาย เมื่อคุณทำการเรียกใช้:

pwd -P

มันจะส่งคืนเส้นทางทั้งหมดหลังจากแก้ไข symlinks

การใช้ getcwd

อีกวิธีหนึ่งในการทำสิ่งนี้คือการใช้ฟังก์ชัน getcwd จากไลบรารี unistd.h ใน C อย่างไรก็ตาม หากคุณกำลังทำสคริปต์ คุณสามารถเชื่อถือคำสั่ง shell แทนได้ ซึ่งเป็นการดีที่รู้ว่า getcwd มีพฤติกรรมที่คล้ายกันกับ pwd -P

การสร้างฟังก์ชัน Resolve

คุณสามารถห่อหุ้มคำสั่งเหล่านี้ในฟังก์ชันเพื่อทำให้การทำงานของคุณง่ายขึ้น ตัวอย่างของฟังก์ชัน resolve ที่ง่ายใน Bash shell คือ:

resolve() {
    # ใช้เส้นทางที่ให้มาและดำเนินการแก้ไข
    local target=$1
    # `readlink -f` ทำการติดตาม symlinks และส่งคืนเส้นทางแบบเต็ม
    local full_path=$(readlink -f "$target")
    echo "$full_path"
}

การใช้งานตัวอย่าง

ตอนนี้เพียงแค่เรียกฟังก์ชันด้วย:

resolve "foo"

นั่นจะส่งคืน:

/Users/greg/tmp/bar

รูปแบบนี้ทำให้คุณสามารถเข้าถึงเส้นทางเต็มของ symlink ที่คุณพบในสภาพแวดล้อมของ Shell Script

ของแถม: การแก้ไขเส้นทางโฮมของผู้ใช้

หากคุณต้องการแก้ไขไดเร็กทอรีบ้านโดยใช้การบันทึกเครื่องหมาย ~ (เช่น ~username) Bash จะขยายเส้นทางเหล่านี้โดยอัตโนมัติใน Shell Script ดังนั้นคุณสามารถรวมสิ่งนี้กับฟังก์ชัน resolve ของคุณได้อย่างราบรื่น

สรุป

การแก้ไขลิงก์สัญลักษณ์ใน Shell Script ไม่จำเป็นต้องซับซ้อน โดยการใช้คำสั่ง pwd -P หรือการสร้างฟังก์ชันช่วยเหลือเช่น resolve ที่ใช้ readlink คุณสามารถกำหนดเส้นทางทั้งหมดไปยังเป้าหมายของคุณได้อย่างมีประสิทธิภาพ ทักษะนี้เป็นสิ่งสำคัญสำหรับผู้ที่ทำงานในสภาพแวดล้อม Unix-like และทำให้สคริปต์ของคุณมีความแข็งแกร่งและให้ข้อมูลมากขึ้น

อย่าลืมว่าการจัดการ symlinks อย่างดีสามารถช่วยให้คุณประหยัดเวลาและลดความสับสนในขณะที่นำทางโครงสร้างไดเร็กทอรีหรือเขียน Shell Script ที่ซับซ้อน.