readlink คือหนึ่งในคำสั่งพื้นฐาน (Command) บนระบบปฏิบัติการ Unix และ Linux ที่มีประโยชน์อย่างมากสำหรับผู้ดูแลระบบ (Sysadmin) หรือนักพัฒนา โดยหน้าที่หลักของมันคือ “การอ่านค่าและแสดงผลปลายทางที่แท้จริงของ Symbolic Link (หรือที่เรียกกันติดปากว่า Symlink)” หากคุณเคยเจอปัญหาว่าสับสนว่าไฟล์ทางลัดนี้ชี้ไปที่ไหน หรือต้องการใช้ Script เข้าไปจัดการกับไฟล์ต้นทาง คำสั่ง readlink คือเครื่องมือที่จะช่วยชีวิตคุณได้ครับ
💡 ทำความเข้าใจก่อน: Symbolic Link คืออะไร?
เพื่อให้เห็นภาพชัดเจนขึ้น Symbolic Link ทำหน้าที่คล้ายกับ “Shortcut” บน Windows มันไม่ใช่ไฟล์จริง ๆ แต่เป็นไฟล์พิเศษที่ทำตัวเป็นป้ายบอกทางชี้ไปยังไฟล์หรือโฟลเดอร์อื่น
เมื่อเราใช้คำสั่งทั่วไปเช่น ls -l เราอาจจะเห็นลูกศรชี้บอกทาง เช่น my_shortcut -> /var/www/html/real_file.txt แต่ถ้าเราต้องการเอาเฉพาะ “ที่อยู่ปลายทาง” นั้นมาใช้งานในโปรแกรมหรือ Script การใช้ ls จะทำได้ยากมาก นั่นจึงเป็นเหตุผลที่ต้องมี readlink
🛠️ วิธีการใช้งาน readlink พร้อมตัวอย่าง
โครงสร้างคำสั่งทั่วไปของ readlink นั้นง่ายมากreadlink [options] <ชื่อ_symlink>
การใช้งานแบบปกติ (ดูปลายทางของ Link)
สมมติว่าคุณมี Symlink ชื่อ shortcut_config ที่ชี้ไปยัง /etc/nginx/nginx.conf
readlink shortcut_config
ผลลัพธ์ที่ได้
/etc/nginx/nginx.conf
⚠️ ข้อควรระวัง: หากคุณใช้ readlink กับไฟล์ธรรมดาที่ไม่ใช่ Symlink คำสั่งจะไม่แสดงผลลัพธ์อะไรออกมาเลย และจะจบการทำงานเงียบ ๆ (Exit code เป็น 1)
ออปชันยอดนิยมที่ต้องรู้
ในบรรดา Option ทั้งหมด มีอยู่ 2 ตัวที่ถูกใช้งานบ่อยที่สุดเพื่อแก้ปัญหาในชีวิตจริง-f (Canonicalize / Canonical path)
ออปชันนี้คือร่างทองของ readlink มันจะทำการแกะรอย (Resolve) เส้นทางทั้งหมดอย่างละเอียด ไม่ว่า Symlink นั้นจะซ้อนกันกี่ชั้น (Link ชี้ไปหา Link อีกที) หรือเป็น Relative path (../) มันจะแปลงออกมาเป็น Absolute Path (เส้นทางเต็มตั้งแต่ราก /) ที่แท้จริงให้เสมอ
นอกจากนี้ หากใช้ -f กับ ไฟล์ธรรมดา (ไม่ใช่ Symlink) มันจะแสดงตำแหน่งปัจจุบันแบบเต็มของไฟล์นั้นให้ทันทีreadlink -f ../downloads/app_link
ผลลัพธ์ที่ได้/home/user/downloads/app_v1.0/binary_file
-e (Canonicalize and Ensure existence)
ทำงานคล้ายกับ -f ทุกประการ แต่มีความเข้มงวดกว่า คือ ไฟล์หรือโฟลเดอร์ปลายทางสุดท้ายจะต้องมีอยู่จริงบนระบบเท่านั้น หากปลายทางถูกลบไปแล้ว (กลายเป็น Broken Link) คำสั่งจะไม่แสดงผลลัพธ์อะไรเลย มักใช้ใน Script เพื่อตรวจสอบความถูกต้องของไฟล์ก่อนเริ่มทำงาน
🚀 การประยุกต์ใช้ใน Bash Script (Use Cases)
ส่วนใหญ่แล้วเรามักไม่ได้พิมพ์ readlink เพื่อดูด้วยตาตัวเองบ่อยนัก แต่เรามักจะใช้มันใน Automated Script เพื่อหาตำแหน่งที่ตั้งของตัว Script เอง เช่น
#!/bin/bash
# หาตำแหน่งที่ตั้งที่แท้จริงของ Script นี้ (แม้จะถูกเรียกผ่าน Symlink จากที่อื่น)
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
echo "Script นี้ทำงานอยู่ที่โฟลเดอร์: $SCRIPT_DIR"
ทำไมต้องทำแบบนี้?
เพราะถ้าเรานำ Script นี้ไปสร้าง Symlink ไว้ที่ /usr/local/bin เพื่อให้เรียกใช้ได้จากทุกที่ การใช้คำสั่ง $0 ปกติจะได้ค่าเป็น /usr/local/bin/myscript แต่ถ้าเราใช้ readlink -f "$0" มันจะย้อนรอยกลับไปหาโฟลเดอร์ดั้งเดิมที่ Script ตัวจริงอยู่ ทำให้ Script สามารถเรียกใช้ไฟล์ข้างเคียง (เช่น ไฟล์ Config หรือ Log) ได้อย่างถูกต้องไม่ว่าจะถูกรันจากที่ไหน
📊 สรุปสั้น ๆ ให้จำง่าย
| คำสั่ง / ออปชัน | หน้าที่หลัก | เหมาะกับสถานการณ์ไหน? |
readlink file | อ่านปลายทางของ Symlink ตรง ๆ | อยากรู้ว่า Link นี้ชี้ไปที่ไหนแบบตื้น ๆ |
readlink -f file | หา Absolute Path ที่แท้จริง (ทะลุทุก Link) | ใช้ใน Script เพื่อหาตำแหน่งไฟล์ที่แน่นอน |
readlink -e file | หา Path ที่แท้จริง และเช็กว่าไฟล์ต้องไม่พัง | ใช้เช็กว่า Link ปลายทางยังมีตัวตนอยู่ไหม |
อ่านเพิ่มเติม