แก้ไข: ข้อผิดพลาด "ล่ามไม่ถูกต้อง: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว" ใน Linux

เผยแพร่แล้ว: 2023-05-01
คนที่พิมพ์บนแป้นพิมพ์ขนาดเล็ก Cherry KW 9200
Hannah Stryker / How-To Geek
หากคุณได้รับข้อผิดพลาด "ตัวแปลที่ไม่ดี: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว" เมื่อเรียกใช้เชลล์สคริปต์ คุณจะต้องแปลงไฟล์สคริปต์ของคุณจาก Windows เป็น Unix ที่ลงท้ายบรรทัด วิธีหนึ่งคือใช้คำสั่ง dos2unix ดังนี้

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

คุณสามารถยืนยันปัญหาในเทอร์มินัล Linux ได้ด้วยการชี้คำสั่ง file ไปที่สคริปต์ของคุณ

 ไฟล์ script1.sh 

ตรวจสอบบรรทัดของไฟล์ที่ลงท้ายด้วยคำสั่ง file ใน Linux

หากไฟล์ใช้การลงท้ายบรรทัดของ 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 

ป้อนคำสั่ง dos2unix

ตรวจสอบกับ file หากคุณต้องการยืนยันว่าการแปลงสำเร็จก่อนที่จะเรียกใช้สคริปต์ของคุณ คุณยังสามารถแปลงจำนวนมากได้ด้วยการตั้งชื่อไฟล์หลายไฟล์โดยคั่นด้วยช่องว่างเท่านั้น

 dos2unix script1.sh script2.sh script3.sh

หรือหากคุณตั้งชื่อไฟล์ที่สอดคล้องกัน แน่นอนว่าคุณสามารถเขียนคำสั่งให้สั้นลงโดยใช้อักขระตัวแทนได้

 สคริปต์ dos2unix*.sh 

ใช้เครื่องหมายดอกจันในคำสั่ง dos2unix เพื่อแปลงด้วยไวด์การ์ด

คำสั่ง 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=ยูนิกซ์ 

เปลี่ยนรูปแบบไฟล์สคริปต์ด้วยคำสั่ง vim

ที่เกี่ยวข้อง: วิธีออกจาก Vi หรือ Vim Editor

ใช้ Geany

หากคุณกำลังทำงานในสภาพแวดล้อมแบบเดสก์ท็อป ก็ไม่มีเหตุผลใดที่จะต้องหลงกลในเทอร์มินัลเพียงเพื่อทำให้ไฟล์ของคุณพร้อมสำหรับโลก Unix ตัวแก้ไขโค้ดและ IDE แทบทุกตัวมีการสลับสำหรับการสิ้นสุดบรรทัด ซึ่งรวมถึงเกียนี่ด้วย

หากต้องการแปลงการลงท้ายบรรทัดใน Geany ให้ไปที่ Document > Set Line Endings > Convert และ Set เป็น LF (Unix)

ใน Geany ภายใต้เมนู Document ให้ไปที่ "Set Line Endings" แล้วเลือก "Convert and Set to LF (Unix)"

บันทึกสคริปต์ของคุณและลองเรียกใช้อีกครั้ง

ใช้ Kate หรือ Kwrite

หากคุณใช้ Kwrite เพื่อแก้ไขสคริปต์ของคุณ หรือ Kate ลูกพี่ลูกน้องที่ทรงพลังกว่าของ Kwrite คุณสามารถแปลงเป็นรูปแบบ LF ได้โดยคลิกที่ Tools > End of Line > Unix

ใน Kwrite ในเมนู 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”

ในการตั้งค่า VS Code ให้เปลี่ยนการตั้งค่า EOL เริ่มต้นเป็น "\n"

ที่เกี่ยวข้อง: วิธีสร้างฮาร์ดแวร์ Bash Scripts ของคุณ