แก้ไข: ข้อผิดพลาด "ล่ามไม่ถูกต้อง: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว" ใน Linux
เผยแพร่แล้ว: 2023-05-01dos2unix
ดังนี้dos2unix script1.sh
คุณลองเรียกใช้สคริปต์ Bash และได้รับข้อความแสดงข้อผิดพลาด “/bin/bash^M: ตัวแปลที่ไม่ดี: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว” หรือไม่ เอาต์พุตไม่มีประโยชน์มากนักและเกือบจะให้ความรู้สึกว่าสคริปต์ของคุณขาดหายไป โชคดีที่ไม่เป็นเช่นนั้น และการแก้ไขก็ง่ายมาก
ข้อผิดพลาด "ล่ามไม่ถูกต้อง: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว" คืออะไร
วิธีแก้ไขข้อผิดพลาด "ล่ามไม่ถูกต้อง: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว"
โดยใช้คำสั่ง dos2unix
การใช้คำสั่ง tr
โดยใช้คำสั่ง sed
ใช้ vi หรือ vim
ใช้ Geany
ใช้ Kate หรือ Kwrite
ใช้ Notepad ++
ใช้รหัส VS
ข้อผิดพลาด “ล่ามไม่ถูกต้อง: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว” คืออะไร?
ได้รับข้อความแสดงข้อผิดพลาดที่อ่าน /bin/bash^M: bad interpreter: No such file or directory
ดังกล่าว หมายความว่าไฟล์เชลล์สคริปต์ของคุณลงท้ายบรรทัดผิด อักขระที่อยู่ท้ายบรรทัดบ่งชี้ว่าถึงเวลาที่ต้องย้ายไปที่ บรรทัดถัดไป Windows ที่สืบเชื้อสายมาจาก DOS ชอบที่จะเห็นเทอร์มิเนเตอร์ “carriage return and line feed” (CRLF) ที่มีสัญลักษณ์ \r\n
ในทางตรงกันข้าม Linux, macOS สมัยใหม่ และระบบที่ใช้ Unix อื่นๆ ใช้เพียง “line feed” (LF) หรือ \n
หากคุณเห็นข้อผิดพลาดของล่ามที่ไม่ดีนี้ เป็นไปได้ทั้งคุณหรือบุคคลที่คุณได้รับสคริปต์จากตอนแรกที่เขียนสคริปต์นี้บนคอมพิวเตอร์ที่ใช้ Windows Bash เห็นการสิ้นสุดบรรทัด \r\n
ที่กำหนดโดยคอมพิวเตอร์ Windows และอารมณ์เสียเพราะจะทำให้เชลล์ไม่สามารถตีความสคริปต์ของคุณได้อย่างถูกต้อง
คุณสามารถยืนยันปัญหาในเทอร์มินัล Linux ได้ด้วยการชี้คำสั่ง file
ไปที่สคริปต์ของคุณ
ไฟล์ script1.sh
หากไฟล์ใช้การลงท้ายบรรทัดของ DOS คุณจะเห็นข้อความ "พร้อมตัวสิ้นสุดบรรทัด CRLF" ต่อท้ายในเอาต์พุต หากสคริปต์ของเราใช้การขึ้นบรรทัดใหม่ของ Unix (LF) ที่เหมาะสม มันจะไม่พูดถึงเทอร์มิเนเตอร์เลย โชคดีที่การกลับมาทำธุรกิจ LF เป็นเรื่องง่าย
วิธีแก้ไขข้อผิดพลาด "ล่ามที่ไม่ดี: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว"
สิ่งที่ต้องทำเพื่อกำจัดข้อความแสดงข้อผิดพลาดนั้นและเริ่มเรียกใช้สคริปต์ของคุณตามปกติคือเปลี่ยนจากการสิ้นสุดบรรทัด DOS เป็นการสิ้นสุดบรรทัด Unix คุณสามารถทำได้ด้วยคำสั่งเทอร์มินัลหรือในโปรแกรมแก้ไขรหัสที่คุณชื่นชอบ ต่อไปนี้เป็นแปดวิธีในการแก้ไข:
โดยใช้คำสั่ง dos2unix
มีโปรแกรมบรรทัดคำสั่งที่สร้างขึ้นสำหรับการแปลงไฟล์ DOS (aka, Windows) เป็นไฟล์ที่เข้ากันได้กับ Unix โดยสมบูรณ์ชื่อ aptly dos2unix
มีอยู่ในที่เก็บเริ่มต้นส่วนใหญ่ คุณจึงสามารถติดตั้งบน Ubuntu ด้วย:
sudo apt ติดตั้ง dos2unix
ในการติดตั้ง Fedora dos2unix
ของเรามีการติดตั้งไว้ล่วงหน้า แต่คุณสามารถยืนยันว่ามี:
sudo dnf ติดตั้ง dos2unix
บน Arch Linux:
sudo pacman -S dos2unix
การใช้ dos2unix
นั้นง่ายมาก; เพียงแค่ตั้งชื่อไฟล์ของคุณ
dos2unix script1.sh
ตรวจสอบกับ file
หากคุณต้องการยืนยันว่าการแปลงสำเร็จก่อนที่จะเรียกใช้สคริปต์ของคุณ คุณยังสามารถแปลงจำนวนมากได้ด้วยการตั้งชื่อไฟล์หลายไฟล์โดยคั่นด้วยช่องว่างเท่านั้น
dos2unix script1.sh script2.sh script3.sh
หรือหากคุณตั้งชื่อไฟล์ที่สอดคล้องกัน แน่นอนว่าคุณสามารถเขียนคำสั่งให้สั้นลงโดยใช้อักขระตัวแทนได้
สคริปต์ dos2unix*.sh
คำสั่ง dos2unix
มีหลายแฟล็กเพื่อช่วยคุณทำการแปลงประเภทพิเศษ เช่น การเปลี่ยนการเป็นเจ้าของไฟล์ คุณสามารถใช้ในรูปแบบย้อนกลับ unix2dos
หากคุณต้องการเปลี่ยนกลับเป็น CRLF ป้อน dos2unix --help
เพื่อเรียนรู้เพิ่มเติม
การใช้คำสั่ง tr
หากคุณไม่สามารถหรือไม่ต้องการติดตั้งยูทิลิตี้เฉพาะ Linux มีเครื่องมือในตัวที่จะล้างการขึ้นบรรทัดใหม่เหล่านั้น ด้วยคำสั่ง tr
คุณสามารถตัดส่วน \r
ของส่วนท้ายบรรทัดออกได้ ดังนั้นเราจะเหลือ \n
เทอร์มิเนเตอร์
tr -d '\r' < script1.sh > script1_unix.sh
ที่นี่ tr
กำลังรับข้อความของไฟล์ script1.sh
ลบทุกอินสแตนซ์ของ \r
ที่พบ และบันทึกเอาต์พุตเป็นไฟล์ script1_unix.sh
โดยใช้คำสั่ง sed
คำสั่ง sed
อันยิ่งใหญ่ที่สร้างขึ้นในเชลล์ของคุณสามารถเปลี่ยนการสิ้นสุดบรรทัดสำหรับไฟล์ของคุณ
sed -i 's/\r//' script1.sh
หากคุณไม่คุ้นเคยกับไวยากรณ์ sed
เรากำลังบอกให้ sed
แก้ไขไฟล์ของเรา ( -i
) และแทนที่ ( s/
) การขึ้นบรรทัดใหม่แต่ละครั้ง ( \r
) โดยไม่ทำอะไรเลย นั่นทำให้เรามีตัวยุติบรรทัด \n
ที่ต้องการของ Unix
ใช้ vi หรือ vim
หากคุณใช้ vi หรือ vim เพื่อแก้ไขสคริปต์ของคุณ เพียงส่งคำสั่งนี้เพื่อแปลงไฟล์ที่เปิดอยู่ในปัจจุบันให้ลงท้ายบรรทัด Unix
:set fileformat=ยูนิกซ์
ที่เกี่ยวข้อง: วิธีออกจาก Vi หรือ Vim Editor
ใช้ Geany
หากคุณกำลังทำงานในสภาพแวดล้อมแบบเดสก์ท็อป ก็ไม่มีเหตุผลใดที่จะต้องหลงกลในเทอร์มินัลเพียงเพื่อทำให้ไฟล์ของคุณพร้อมสำหรับโลก Unix ตัวแก้ไขโค้ดและ IDE แทบทุกตัวมีการสลับสำหรับการสิ้นสุดบรรทัด ซึ่งรวมถึงเกียนี่ด้วย
หากต้องการแปลงการลงท้ายบรรทัดใน Geany ให้ไปที่ Document > Set Line Endings > Convert และ Set เป็น LF (Unix)
บันทึกสคริปต์ของคุณและลองเรียกใช้อีกครั้ง
ใช้ Kate หรือ Kwrite
หากคุณใช้ Kwrite เพื่อแก้ไขสคริปต์ของคุณ หรือ Kate ลูกพี่ลูกน้องที่ทรงพลังกว่าของ Kwrite คุณสามารถแปลงเป็นรูปแบบ LF ได้โดยคลิกที่ Tools > End of Line > Unix
บันทึกไฟล์และเรียกใช้สคริปต์ของคุณอีกครั้ง
ใช้ Notepad ++
หากคุณแก้ไขโค้ดใน Notepad++ คุณยังสามารถแปลงการลงท้ายบรรทัดได้อย่างง่ายดาย ซึ่งสะดวกเพราะคุณอาจใช้งานบน Windows (เว้นแต่คุณจะติดตั้ง Notepad++ สำหรับ Linux) และสามารถแปลงได้ก่อนที่จะย้ายไปยังระบบ Linux ของคุณ เมื่อเปิดไฟล์แล้ว ให้ไปที่ Edit > EOL Conversion > Unix (LF)
อย่าลืมบันทึกสคริปต์ของคุณก่อนที่จะเรียกใช้
หากคุณต้องการให้ Notepad++ สร้างไฟล์ที่มีบรรทัดสิ้นสุดของ Unix ตามค่าเริ่มต้น ให้ไปที่การตั้งค่า > การตั้งค่า เลือกแท็บ "เอกสารใหม่" และใต้ตัวเลือก "รูปแบบ (การสิ้นสุดบรรทัด)" ให้คลิกปุ่มตัวเลือก "Unix (LF)"
ใช้รหัส VS
Visual Studio Code (VS Code) ทำงานในลักษณะเดียวกันมาก มีเพียงปุ่มสลับเท่านั้นที่ค้นหาได้ง่ายยิ่งขึ้น เพียงคลิก “CRLF” ที่มุมขวาล่างของหน้าต่าง VS Code
คุณยังสามารถตั้งค่า VS Code ให้ใช้การลงท้ายบรรทัด Unix โดยค่าเริ่มต้น โดยไปที่ File > Preferences > Settings และพิมพ์ eol
ในแถบค้นหาการตั้งค่า ผลลัพธ์สูงสุดควรเป็นเมนูแบบเลื่อนลงสำหรับการตั้งค่า "Eol" เปลี่ยนเป็น “\n”
ที่เกี่ยวข้อง: วิธีสร้างฮาร์ดแวร์ Bash Scripts ของคุณ