Linux มี shell เริ่มต้นคือ Bash (Bourne again shell) สำหรับรันคำสั่งระบบ นักเขียนโปรแกรมส่วนใหญ่ชอบ Bash มากกว่า cmd เพราะความยืดหยุ่นและตัวแปลคำสั่ง (command line interpreter) ที่ทรงพลัง แต่ผู้ใช้หลายคนยังเจอปัญหา การจัดการชื่อไฟล์ที่มีช่องว่างใน Bash เพราะช่องว่างใน Bash ไม่ได้ทำงานเหมือนในชื่อไฟล์
ทำไมชื่อไฟล์ที่มีช่องว่างไม่ถูกจดจำใน Bash?
ใน Bash หากพิมพ์หลายคำโดยไม่มี อักขระ escape (\) หรือ เครื่องหมายคำพูด (quotations) Bash จะถือว่าทุกคำเป็น arguments (อาร์กิวเมนต์) แยกกัน ใช้ได้กับทุกการดำเนินการ ไม่ว่าจะเปลี่ยนไดเรกทอรีด้วย cd หรือเข้าถึงไฟล์ด้วย cat สิ่งที่พิมพ์หลังคำสั่งเหล่านี้ จะถูกมองว่าเป็นอาร์กิวเมนต์ ตัวอย่าง:
cat file name.txt
หมายเหตุ: ชื่อไฟล์อะไรก็ได้ ในบทความนี้ใช้ 「file name.txt」 เป็นตัวอย่าง
คำสั่ง cat จะถือว่า file และ name เป็นอาร์กิวเมนต์ 2 ตัว แทนที่จะเป็นอาร์กิวเมนต์เดียว คือ 「file name.txt」 แต่หากใช้ escape character หรือเครื่องหมายคำพูด Bash shell จะถือว่าเป็นอาร์กิวเมนต์เดียว
ชื่อไฟล์ที่มีช่องว่างใน Bash
มีไม่กี่วิธาสำหรับช่องว่างในชื่อ ไว้ปฏิบัติที่ดีที่สุดคือ หลีกเลี่ยงช่องว่างในชื่อไฟล์ในอนาคต วิธีง่ายคือ เปลี่ยนชื่อไฟล์ที่ต้องการเข้าถึง ให้ไม่มีช่องว่าง วิธีอื่นคือ ใช้เครื่องหมายคำพูดเดี่ยวหรือคู่ หรือใช้สัญลักษณ์ escape (\) ก่อนช่องว่าง เราจะแนะนำวิธีพร้อมตัวอย่าง
วิธีที่ 1: ใช้เครื่องหมายคำพูดเดี่ยวและคู่ (Single and Double Quotations)
- กด Ctrl + Alt ค้าง แล้วกด T เปิด Terminal
- เปลี่ยนไดเรกทอรีไปที่ไฟล์ตั้งอยู่ (หรือ ลากและวาง (drag and drop) ไฟล์ใน Terminal หลังคำสั่ง cat จะใส่เครื่องหมายคำพูดอัตโนมัติ)
- พิมพ์คำสั่งอ่านไฟล์ข้อความที่มีช่องว่างในชื่อ:
cat 'file name.txt'
หรือcat "file name.txt"
- เครื่องหมายคำพูดเดี่ยวและคู่ ให้ผลลัพธ์เหมือนกัน บางกรณีต้องลองทั้งคู่ดูว่าตัวไหนทำงาน
cd Desktopหมายเหตุ: Desktop เปลี่ยนเป็นตำแหน่งที่ต้องการ
วิธีที่ 2: ใช้ตัวอักษร Escape (Backslash)
- กด Ctrl + Alt ค้าง แล้วกด T เปิด Terminal
- เปลี่ยนไดเรกทอรีไปที่ไฟล์ตั้งอยู่:
cd Desktop
หมายเหตุ: ใส่ชื่อตำแหน่งแทน Desktop - พิมพ์คำสั่ง ใช้ escape character (\) ทุกที่ที่มีช่องว่างในชื่อ:
cat file\ name.txt
โบนัส: การใช้เครื่องหมายคำพูดและ Escape ร่วมกัน
บางครั้งใช้ไดเรกทอรีในคำสั่ง การใส่เครื่องหมายคำพูดทั้งพาธอาจสร้างปัญหา เพราะคำสั่งอย่าง mv หรือ cp จะถือพาธทั้งหมดเป็น file source หากใส่เครื่องหมายคำพูดครอบทั้งพาธ ต้องใส่เครื่องหมายคำพูดสำหรับ source และ destination แยกกัน เพื่อให้คำสั่ง cp ทำงานถูกต้อง การใช้ escape character สำหรับพาธทั้งหมดซับซ้อนกว่าและง่ายต่อการพลาด ตัวอย่างในภาพ