एक .sh फ़ाइल को निष्पादित करने में सक्षम नहीं: / बिन / बैश ^ एम: खराब दुभाषिया


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एक है गाड़ी वापसी चरित्रलाइन के अंत को चिह्नित करने के लिए लाइन लाइन फीड वर्ण का उपयोग करता है, जबकि विंडोज दो-चरित्र अनुक्रम सीआर एलएफ का उपयोग करता है। आपकी फ़ाइल में विंडोज लाइन एंडिंग है, जो लिनक्स को भ्रमित कर रहा है।

नकली सीआर अक्षर निकालें। आप इसे निम्न आदेश के साथ कर सकते हैं:

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

22
या dos2unixप्रोग्राम को स्थापित और उपयोग करें ।
अरेंजपेप्टर

4
इसके लिए धन्यवाद, Ive के अन्य सभी उत्तर अब तक नहीं मिले हैं। यह एक ने किया!
कोडीनिजा

विंडोज होना जरूरी नहीं है, मुझे OS X से उबंटू की स्क्रिप्ट कॉपी करने के बाद एक समान संदेश मिला ... dos2unix ने उस मामले में बहुत अच्छा काम किया, जबकि '\ r' की जगह कुछ भी खराब नहीं होगा, क्योंकि कोई '\ _' नहीं है। n 'फ़ाइल में वर्ण।
माइकल

1
@Michael macOS का उपयोग करता है \nक्योंकि यह यूनिक्स है। स्क्रिप्ट शायद पहले के मैक ओएस संस्करण से थी? आप sed -i -e 's/\r$/\n/' script.shउस मामले में भाग सकते हैं ।
वेजेंड्रिया

1
इसे gedit में खोलें और Save As पर क्लिक करें, और "Line Ending: Unix / Linux" चुनें
Mattmon

23

Vim में आप उपयोग भी कर सकते हैं :set ff=unixऔर फिर फाइल को सेव कर सकते हैं, या :set ff=dosफिर DOS फॉर्मेटिंग प्राप्त कर सकते हैं।


यह एक मेरे लिए, thx
bunkerdive

19

आपकी फ़ाइल में DOS / Windows स्टाइल लाइन एंडिंग (CR LF) है , लेकिन यूनिक्स जैसे सिस्टम पर केवल LF नियंत्रण वर्ण का उपयोग लाइन ब्रेक के रूप में किया जाता है।

अतिरिक्त CR नियंत्रण वर्ण को ^Mआपके आउटपुट में एन्कोडेड दिखाया गया है । जब आप दौड़ते हैं तो आप इसे देख भी सकते हैं cat -A create_mgw_3shelf_6xIPNI1P.sh

डॉस / विंडोज शैली से लाइन एंडिंग को यूनिक्स शैली में बदलने के लिए, एक टूल है जिसे कहा जाता है dos2unix। आप इसका उपयोग कर स्थापित करें:

sudo apt-get install dos2unix

तब आप केवल दोनों तरीकों से फ़ाइलों की लाइन एंडिंग का उपयोग करके परिवर्तित कर सकते हैं

dos2unix FILENAME
unix2dos FILENAME

आपके मामले में, बस इस कमांड को नीचे चलाएं और स्क्रिप्ट फ़ाइल को इन-प्लेस में बदल दिया जाएगा:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

उसके बाद बैश को फ़ाइल की सही ढंग से व्याख्या करने में सक्षम होना चाहिए।


1
धन्यवाद, dos2unix भी काढ़ा के माध्यम से macOS के लिए उपलब्ध है।
मुहम्मद अन्नाकीब

5

समस्या यह है कि आप डॉस के साथ संपादित नहीं करते हैं!

vi के साथ अपनी फ़ाइल खोलें तो इसके साथ unix सेट करें:

:set ff=unix
:wq

और यह सब ठीक है


4

करते हैं vi <your script>

फिर :set list; यह आपकी स्क्रिप्ट में किसी भी विशेष वर्ण को प्रदर्शित करेगा।

फिर चरित्र को बदलें:

:%s/^M//gc [टाइप करने के लिए ^Mप्रेस Ctrl+ v+ m]


उपयोग करने के बारे में उपरोक्त उत्तर देखें: फ़ाइलफॉर्मैट जो वैश्विक प्रतिस्थापन की तुलना में इसे संभालने के लिए बेहतर है, इसके अलावा, stackoverflow.com/questions/14609779/… अपने आप को संभालने के लिए विचारों के लिए देखें
qneill

4

जैसा कि अन्य उत्तरों में बताया गया है, यह एक प्रारूप मुद्दा है। तो, इसका उत्तर DOS से यूनिक्स स्टाइल लाइन एंडिंग्स में प्रारूप को बदलना है। यह आपकी फ़ाइल को 'जगह' में ठीक करने का एक और सरल तरीका है

fromdos file

यह पैकेज में उपलब्ध है tofrodos:

sudo apt-get install tofrodos

2

अवांछित पात्रों को हटाने के लिए आप गेडिट का भी उपयोग कर सकते हैं। फ़ाइल मेनू के तहत इस रूप में सहेजें चुनें और लाइन अंत प्रकार यूनिक्स / लिनक्स सेट करें।


इसके लिए +1 किया क्योंकि इसने मुझे MacOS लाइन एंडिंग में मदद की।
बोबले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.