Paths: absolute vs relative
อ่าน path ทุกแบบออก absolute (/) vs relative, 4 สัญลักษณ์ . .. ~ /, ทำไม ./script.sh ไม่ใช่ script.sh, case-sensitivity บน Linux
บทที่แล้วใช้ cd Documents กระโดดไป folder ข้างๆ ได้ง่ายๆ แต่พอเริ่มทำงานจริงจะเจอคำสั่งหน้าตาแบบ ./script.sh, ../config.json, หรือ ~/.zshrc คำถามคือ เครื่องหมาย ., .., ~, / พวกนี้คืออะไร แล้วต่างกันยังไง
บทนี้จะทำให้อ่าน path ทุกแบบออกด้วยหลักเดียว path ในโลก Unix มีแค่ 2 ชนิดคือ absolute กับ relative เข้าใจ 2 อันนี้ก็อ่านได้หมด
2 ชนิดของ path
ทุก path ที่พิมพ์ใน terminal ถูกจัดเป็นกลุ่มใดกลุ่มหนึ่งจาก 2 กลุ่มนี้ ดูง่ายๆ จาก ตัวแรกสุด ของ path
- Absolute path เริ่มด้วย
/เช่น/Users/krish/Desktopหรือ/etc/hostsอ่านจากรากของต้นไม้เสมอ ไม่ว่ายืนอยู่ที่ไหนก็ชี้ไปที่เดียวกัน - Relative path ไม่เริ่มด้วย
/เช่นDesktop,./script.sh,../configอ่านจาก ที่ยืนอยู่ปัจจุบัน (cwd) ย้าย cwd แล้วความหมายก็เปลี่ยน
~ เป็นกรณีพิเศษ shell จะ expand (แทนค่า) ~ เป็น /Users/ชื่อคุณ ก่อนตีความต่อ ดังนั้นหลัง expand แล้ว ~/Desktop จะกลายเป็น absolute path ทันที (/Users/ชื่อคุณ/Desktop)
4 สัญลักษณ์ที่ต้องอ่านออก
./script.sh = script ในที่ยืนอยู่ ./ ย่อมาจาก “ตรงนี้”cd .. = ขึ้นไป 1 ชั้น ../README.md = README ของ folder แม่/Users/ชื่อคุณ (Mac) หรือ /home/ชื่อคุณ (Linux)ลอง resolve ทีละขั้น
สมมติยืนอยู่ที่ ~/projects/vibe-code (cwd) เลือก path ข้างล่างแล้วกด Step ดู shell ตีความทีละ segment ว่าแต่ละตัวทำอะไรกับ path ปัจจุบัน
../learn-git~/projects/vibe-codeทำไม ./script.sh ไม่ใช่แค่ script.sh
เวลาพิมพ์ชื่อ command แบบไม่มี path นำ (เช่น node, git, ls) shell จะไปค้นในรายการ folder ที่อยู่ใน $PATH (จะเรียนในบท 8) cwd ไม่อยู่ใน $PATH ด้วยเหตุผลด้านความปลอดภัย เพราะถ้าใครสักคนเอาไฟล์ชื่อ ls ปลอมใส่ใน folder ที่คุณ cd เข้าไป คุณอาจรันของปลอมโดยไม่รู้ตัว
เลยต้องเติม ./ ข้างหน้าตอนอยากรัน script ใน cwd ให้ชัดเจนว่า “เอา script ตรงนี้นะ ไม่ใช่จาก $PATH” กฎนี้ใช้เฉพาะตอน รัน เท่านั้น ไม่เกี่ยวกับ cat script.sh หรือ rm script.sh (พวกนี้รับ path เป็น argument ไม่ต้องค้น $PATH)
Trailing slash จำเป็นไหม
cd Documents กับ cd Documents/ ได้ผลเหมือนกันทั้งคู่ shell ไม่สนเรื่อง slash ท้าย แต่บางคนชอบใส่เพื่อให้ชัดว่าเป็น folder ไม่ใช่ไฟล์ ใส่หรือไม่ใส่ก็ได้ไม่ผิด ตามชอบ
สรุป
- Absolute path เริ่มด้วย
/ชี้ไปที่เดียวกันเสมอ - Relative path ไม่เริ่มด้วย
/แล้วแต่ cwd - 4 สัญลักษณ์:
.(ตรงนี้),..(parent),~(home),/(root) - รัน script ใน cwd ต้องเติม
./เพราะ cwd ไม่อยู่ใน$PATH - Linux case-sensitive 100% ตั้งชื่อไฟล์ให้ consistent กันพัง server
ตอนนี้อ่าน path ทุกแบบที่ AI ให้มาออกแล้ว บทต่อไปจะลงมือ จัดการไฟล์จริง สร้าง folder (mkdir), สร้างไฟล์ (touch), copy (cp), ย้าย (mv), ลบ (rm) พร้อม trick glob pattern (*.ts) กับเตือนเรื่อง rm -rf ที่อันตรายที่สุดใน terminal