วิธีแก้ไขลิงก์สัญลักษณ์ใน 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 ที่ซับซ้อน.