ทำไมเครื่องหาคำสั่งเจอ
ทุกคำสั่งคือไฟล์โปรแกรมในเครื่อง $PATH คือ list ร้านที่เครื่องวิ่งไปหาให้ which บอกว่าเก็บที่ไหน เข้าใจ command not found
สงสัยกันมาตั้งแต่บทแรกว่า เวลาพิมพ์ echo หรือ ls เครื่องรู้ได้ยังไงว่าจะรันอะไร? บทนี้คือเฉลย
คำสั่งคือไฟล์โปรแกรมเล็กๆ ในเครื่อง
ความลับอย่างแรก: echo, ls, cat ทุกคำสั่งจริงๆ คือ ไฟล์โปรแกรมเล็กๆ ที่ติดมากับเครื่องทุกเครื่อง
ลองดูว่าไฟล์ ls อยู่ที่ไหนในเครื่อง ใช้ which
which lsจะได้ path ประมาณ /bin/ls หรือ /usr/bin/ls นั่นแหละคือไฟล์ ls ตัวจริงที่รันให้เราทุกครั้ง
ทำไมพิมพ์แค่ ls เครื่องก็เจอ?
คำถามดี ถ้า ls อยู่ที่ /bin/ls เราต้องพิมพ์ path เต็มทุกครั้งหรือเปล่า? จริงๆ ไม่ต้อง พิมพ์ ls เฉยๆ เครื่องก็เจอ
คำตอบ: เครื่องเก็บ list ของร้านที่จะวิ่งไปหาของให้เรา ทุกครั้งที่พิมพ์คำสั่ง เครื่องจะไล่ดูทีละร้านตามลำดับ มีไฟล์ชื่อตรงกันไหม เจอที่แรกก็หยุดรันให้
list นี้ฝรั่งเรียก $PATH เป็น setting ของเครื่อง ทุกเครื่องมีติดมาให้แล้ว
ดู $PATH ของเครื่องตัวเอง
ลองดูว่าเครื่องเรามี list ร้านอะไรบ้าง พิมพ์
echo $PATHจะได้ที่อยู่หลายๆ อันต่อกันด้วยเครื่องหมาย : เช่น
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbinแต่ละที่อยู่คือ folder ที่เครื่องจะไปไล่หาคำสั่งให้ ไล่ตามลำดับซ้ายไปขวา เจอที่แรกก็หยุด
เวลาเจอ “command not found”
ถ้าพิมพ์คำสั่งแล้ว Terminal ตอบ
command not found: <ชื่อคำสั่ง>แปลว่า เครื่องไล่หาทุกร้านใน $PATH แล้วไม่เจอไฟล์ชื่อนี้ มี 2 สาเหตุหลัก
- พิมพ์ผิด เช็คตัวสะกดให้ละเอียด ตัวพิมพ์ใหญ่/เล็กต้องตรง
- ยังไม่ได้ลงโปรแกรมตัวนั้น ต้องลงก่อนถึงจะใช้ได้
which lsดูว่า ls อยู่ในร้านไหน- ร้าน #1
/usr/local/bingitnodepythonbrewcode - ร้าน #2
/usr/binlscdechocatgrepheadtailpskillwhich - ร้าน #3
/binlsechocatrmcpmvmkdir - ร้าน #4
/usr/sbinshutdownreboot
สรุปบทนี้
- คำสั่งทุกตัวจริงๆ คือไฟล์โปรแกรมเล็กๆ ที่อยู่ในเครื่อง
which <คำสั่ง>= ดูว่าไฟล์ของคำสั่งนั้นเก็บที่ไหน$PATH= list ร้านที่เครื่องเข้าไปวิ่งหาคำสั่งให้echo $PATH= ดู list ร้าน- “command not found” = หาทุกร้านแล้วไม่เจอ มักเพราะพิมพ์ผิด หรือยังไม่ได้ติดตั้งโปรแกรม
บทสุดท้ายเป็น capstone “ก่อนกด Enter ทุกครั้ง” รวมทุกบทมาใช้จริง อ่านคำสั่งแปลกๆ ที่เจอจาก YouTube เพื่อน หรือ AI ออกก่อนกด Enter