PlusMagi's Blog By Pitt Phunsanit Linux,macOS,Unix-like readlink: path ของ Symbolic Link

readlink: path ของ Symbolic Link

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 ปลายทางยังมีตัวตนอยู่ไหม

อ่านเพิ่มเติม