บทช่วยสอนนี้อธิบายวิธีสร้าง symlinks (symbolic links) หรือที่รู้จักว่า “Soft Links” ใน Linux ด้วยคำสั่ง ln
หากคุณมาจากพื้นหลังใช้ Windows คุณจะคุ้นเคยกับ shortcuts – ไฟล์ที่ไม่มีข้อมูลจริง แต่มี link ไปยังไฟล์หรือโฟลเดอร์จริงที่ต้องการเข้าถึง
มันอาจมีอยู่เพื่อความสะดวก (ประหยัดเวลาคลิกผ่านโฟลเดอร์ซ้อนๆ) หรือเพื่อ redirect output (คุณมีโปรแกรมที่ hard-code ไดเรกทอรี output และต้องการส่งไปที่อื่น)
Soft Links (Symlinks) ใน Linux ทำหน้าที่เหมือนกันโดยปริยาย
Hard Links vs. Soft Links
- Soft Links (หรือ Symbolic Links หรือ Symlinks) อ้างอิงตำแหน่งของไฟล์/โฟลเดอร์อื่นบน filesystem
- ดังนั้น หากไฟล์ที่ soft linked ถูกลบ soft link จะไร้ความหมาย เพราะชี้ไปไฟล์ที่ไม่มีอยู่
- เนื่องจาก soft link เป็นแค่ reference ไปตำแหน่งไฟล์ที่ link พวกมันสามารถอยู่บน filesystem ต่างกันได้
- Permissions ไม่ถูก share ระหว่าง link และ linked
- Hard links เป็น mirror copy ของไฟล์ที่ link – ทั้งสอง copy อ้างอิงข้อมูลเดียวกันบน storage device
-
- ดังนั้น การลบ hard-linked file ไม่ลบข้อมูล – “Hard Link” อีกตัวยังคงเป็นไฟล์ใน filesystem
- File system จะนับจำนวน references ไปยังไฟล์บนดิสก์ เมื่อ hard links ทั้งหมดถูกลบ count จะเป็น 0 เมื่อ count ถึงศูนย์ ไฟล์จึงถูกลบ และพื้นที่ข้อมูลจะถูก de-allocated เพื่อใช้เก็บไฟล์อื่น
- เนื่องจากเป็น reference เดียวกันสองที่ พวกมันต้องอยู่บน filesystem เดียวกัน
- Permissions ถูก share – ทั้ง linked และ linked คือไฟล์เดียวกันบนดิสก์ถูกอ้างอิงจากสองที่
- ดังนั้น การลบ hard-linked file ไม่ลบข้อมูล – “Hard Link” อีกตัวยังคงเป็นไฟล์ใน filesystem
-
ไวยากรณ์
ln [OPTIONS] SOURCE_PATH LINK_PATH
โปรดทราบว่า:
- ทั้งไฟล์และโฟลเดอร์สามารถใช้เป็น SOURCE_PATH ได้
- Soft link จะถูกสร้างที่ LINK_PATH
ตัวเลือก (Options)
คุณสามารถส่งตัวเลือกต่อไปนี้ให้คำสั่ง ln:
| -F | หาก link ที่เสนอ (link_name) มีอยู่แล้วและเป็น directory ให้ลบมันเพื่อให้ link เกิดขึ้น -F ควรใช้กับ -f หรือ -i หากไม่ระบุ -f implied -F เป็น no-op เว้นแต่ -s ถูกระบุ |
| -h | หาก link_name หรือ link_dirname เป็น symbolic link อย่าติดตามมัน มีประโยชน์กับ -f เพื่อแทนที่ symlink ที่อาจชี้ไป directory |
| -f | หาก link ที่เสนอมีอยู่แล้ว ให้ unlink มันเพื่อให้ link เกิดขึ้น (-f override -i ก่อนหน้า) |
| -i | ทำให้ ln เขียน prompt ไป standard error หาก link ที่เสนอมีอยู่ หาก response จาก standard input เริ่มด้วย y หรือ Y ให้ unlink link ที่เสนอ มิฉะนั้นอย่าพยายาม link (-i override -f ก่อนหน้า) |
| -n | เหมือน -h สำหรับความเข้ากันได้กับ ln implementations อื่น |
| -s | สร้าง symbolic link |
| -v | ทำให้ ln verbose แสดงไฟล์ขณะประมวลผล |
ตัวเลือกเหล่านี้และรายละเอียดเต็มสำหรับคำสั่ง ls หาได้ใน user manual โดยรัน:
man ls
ตัวอย่าง
เพื่อสาธิตการสร้าง symbolic link (symlink สำหรับ short) เราสร้างไฟล์:
touch test_file.txt
จากนั้นสร้าง soft link ไปยังมัน:
ln -s test_file.txt link_to_test_file
คุณสามารถ verify link ได้โดยรัน:
ls -l
ซึ่งจะ output ประมาณ:
-rw-r--r-- 1 user staff 0 2 Jan 01:31 test_file.txt lrwxr-xr-x 1 user staff 9 2 Jan 01:32 link_to_test_file -> test_file.txt
โปรดทราบว่า:
- ตัวอักษรในคอลัมน์แรกแทนประเภทไฟล์/โฟลเดอร์และ permissions
- ตัวเลขตามหลังคือจำนวนไฟล์ที่มีอยู่
- user/staff คือ user/group ที่มีสิทธิ์
- ตามด้วยขนาดไฟล์ วันที่แก้ไข และชื่อ
- เห็น l นำหน้าแถว? หมายถึงมันคือ link
- เพิ่มเติม เห็น -> ท้ายสุด แสดงว่า link ไป test_file.txt
- So, it’s definitely a link
สรุป
เมื่อล็อกอินเข้าเห็นระบบส่วนใหญ่ ผมถูกส่งไป home directory ของ user แทนที่จะพิมพ์ path ไป directory ที่ต้องการทำงานวันนั้น (เช่น directory ที่ host ไฟล์ web app ที่กำลัง deploy) สิ่งแรกที่ทำคือสร้าง soft link ไปโฟลเดอร์นั้น เพื่อไม่ต้องพิมพ์ full path ทุกครั้งที่จะกลับไป
ดังนั้น มันค่อนข้างมีประโยชน์
ใหม่หัด Linux? ใช้งานได้เลยโดยเรียนรู้โค้ดบ้าง!