ไม่สามารถเรียกใช้ไฟล์. sh: / bin / bash ^ M: ล่ามที่ไม่ดี


107

ฉันต้องการรันเชลล์สคริปต์:

-rwxr-x--x 1 root root   17234 Jun  6 18:31 create_mgw_3shelf_6xIPNI1P.sh

ฉันพยายามทำตามขั้นตอนมาตรฐาน แต่ฉันพบข้อผิดพลาดนี้:

./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0 
DEBUG   cd/etc/opt/ldapfiles/ldif_in ;
./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0
**ERROR  sh: ./create_mgw_3shelf_6xIPNI1P.sh: /bin/bash^M: bad interpreter: No such file or directory**

มันหมายความว่าอะไร? ฉันทำสิ่งนี้ในฐานะrootผู้ใช้ภายใต้rootกลุ่ม

หมายความว่าไฟล์ไม่มีสิทธิ์ที่ถูกต้องสำหรับrootผู้ใช้หรือไม่?

คำตอบ:


182

นี่ไม่ใช่ปัญหาสิทธิ์คุณไม่ได้รับข้อความเกี่ยวกับสิทธิ์

/bin/bash^M: bad interpreter: No such file or directory

/bin/bash^Mสคริปต์ที่แสดงให้เห็นว่าจะต้องมีการดำเนินการโดยเชลล์ตั้งอยู่ที่ ไม่มีไฟล์ดังกล่าวเป็น: /bin/bashมันเรียกว่า

^Mเป็นตัวละครที่กลับรถ Linux ใช้อักขระป้อนบรรทัดเพื่อทำเครื่องหมายจุดสิ้นสุดของบรรทัดในขณะที่ Windows ใช้ลำดับ CR LF สองอักขระ ไฟล์ของคุณมีปลายสายของ Windows ซึ่งทำให้ Linux สับสน

ลบอักขระ CR ปลอม คุณสามารถทำได้ด้วยคำสั่งต่อไปนี้:

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh

22
หรือติดตั้งและใช้งานdos2unixโปรแกรม
argentpepper

4
ขอบคุณสำหรับสิ่งนี้คำตอบอื่น ๆ ที่ฉันเคยพบมายังไม่ได้ช่วย อันนี้ทำแล้ว!
qodeninja

ไม่จำเป็นต้องเป็น Windows ฉันได้รับข้อความที่คล้ายกันหลังจากคัดลอกสคริปต์จาก OS X ไปยัง Ubuntu ... dos2unix ทำงานได้ดีในกรณีนี้ในขณะที่แทนที่ '\' ด้วยสิ่งใดจะแย่ลงเนื่องจากไม่มี '\ ตัวอักษร n 'ในไฟล์
ไมเคิล

1
@Michael macOS ใช้\nเพราะเป็น Unix สคริปต์อาจมาจากเวอร์ชัน Mac OS ก่อนหน้าใช่หรือไม่ คุณสามารถเรียกใช้sed -i -e 's/\r$/\n/' script.shในกรณีนั้น
wjandrea

1
เปิดใน gedit และทำ Save As แล้วเลือก "Line Ending: Unix / Linux"
Mattmon

23

ในกลุ่มคุณสามารถใช้:set ff=unixแล้วบันทึกไฟล์หรือ:set ff=dosเพื่อให้ฟอร์แมต DOS อีกครั้ง


อันนี้ทำเพื่อฉันขอบคุณ
บังเกอร์

19

ไฟล์ของคุณมีการสิ้นสุดบรรทัดสไตล์ DOS / Windows (CR LF)แต่ในระบบที่คล้าย Unix จะใช้เฉพาะอักขระควบคุมLF ที่ใช้เป็นตัวแบ่งบรรทัด

อักขระควบคุมCRเพิ่มเติมแสดงขึ้น^Mในรหัสของคุณ cat -A create_mgw_3shelf_6xIPNI1P.shนอกจากนี้คุณยังสามารถมองเห็นได้เมื่อคุณเรียกใช้

การแปลงปลายสายจากสไตล์ DOS / Windows สไตล์ Unix dos2unixมีเครื่องมือที่เรียกว่า คุณติดตั้งโดยใช้:

sudo apt-get install dos2unix

จากนั้นคุณสามารถแปลงไฟล์ที่ลงท้ายด้วยไฟล์ทั้งสองวิธีโดยใช้

dos2unix FILENAME
unix2dos FILENAME

ในกรณีของคุณเพียงแค่เรียกใช้คำสั่งนี้ด้านล่างและไฟล์สคริปต์จะถูกแปลงในสถานที่:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

หลังจาก Bash นั้นควรจะสามารถตีความไฟล์ได้อย่างถูกต้อง


1
ขอบคุณ dos2unix สามารถใช้งานได้กับ macOS ผ่านทาง Brew
Muhammad Annaqeeb

5

ปัญหาคือคุณแก้ไขด้วย Dos!

เปิดไฟล์ของคุณด้วย vi แล้วตั้งค่ายูนิกซ์ด้วย:

:set ff=unix
:wq

และมันก็ใช้ได้ดี


4

vi <your script>ทำ

จากนั้น:set list; มันจะแสดงอักขระพิเศษใด ๆ ในสคริปต์ของคุณ

จากนั้นแทนที่อักขระ:

:%s/^M//gc [เพื่อพิมพ์^MกดCtrl+ v+ m]


ดูคำตอบข้างต้นเกี่ยวกับการใช้: fileformat ซึ่งเป็น IMHO ที่ดีกว่าสำหรับการจัดการมากกว่าการแทนที่ทั่วโลกนอกจากนี้โปรดดูstackoverflow.com/questions/14609779/…สำหรับแนวคิดในการจัดการโดยอัตโนมัติ
qneill

4

ดังที่อธิบายไว้ในคำตอบอื่น ๆ ปัญหานี้เป็นปัญหารูปแบบ ดังนั้นคำตอบคือเปลี่ยนรูปแบบจาก DOS เป็น Unix style line endings นี่เป็นอีกวิธีง่ายๆในการแก้ไขไฟล์ของคุณ 'เข้าแทนที่'

fromdos file

มันมีอยู่ในแพคเกจtofrodos:

sudo apt-get install tofrodos

2

คุณสามารถใช้ gedit เพื่อลบอักขระที่ไม่ต้องการได้ ภายใต้เมนูไฟล์เลือกบันทึกเป็นและตั้งค่าชนิดจุดสิ้นสุดบรรทัด unix / Linux


+1 สำหรับสิ่งนี้เพราะมันช่วยฉันในการสิ้นสุดสาย MacOS
Bobble
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.