शबंग लाइन cr-lf के साथ काम नहीं कर रही है


10

निम्नलिखित प्राथमिक लिपियों के शेबंग भाग क्यों काम नहीं कर रहे हैं:

$ cat hello.sh
#! /bin/sh
echo Hello
$ ./hello.sh
bash: ./hello.sh: /bin/sh^M: bad interpreter: No such file or directory

$ cat hello.py
#! /usr/bin/env python3
print("Hello")
$ ./hello.py
: No such file or directory

मैन्युअल रूप से दुभाषिया को कॉल करते समय काम कर रहा है:

$ sh hello.sh
Hello
$ python3 hello.py
Hello

जवाबों:


11

आपकी स्क्रिप्ट में संभवतः डॉस-शैली CR-LF लाइन एंडिंग्स हैं, न कि यूनिक्स-शैली LF लाइन एंडिंग्स। ^ पहले मामले में त्रुटि संदेश में देखा गया एम एक संकेत है कि 0D चरित्र को स्क्रिप्ट दुभाषिया नाम के भाग के रूप में व्याख्या किया गया था और न कि समाप्त होने वाली रेखा के भाग के रूप में (जैसा कि कोई यह होने की उम्मीद कर सकता है)। चूंकि आपके सिस्टम पर कोई निष्पादन योग्य फ़ाइल नहीं है जिसमें पथ 0D (^ M) शामिल है, सिस्टम दुभाषिया को आमंत्रित करने में सक्षम नहीं है। जब आप मैन्युअल रूप से अपने दुभाषिया को बुलाते हैं, तो यह स्क्रिप्ट में मौजूद दोनों प्रकार की रेखाओं को संभालने में सक्षम होता है।

यदि आप यूनिक्स-शैली LF लाइन एंडिंग्स का उपयोग करने के लिए स्क्रिप्ट्स को रूपांतरित करते हैं, तो आपको शेबंग को काम करते हुए देखना चाहिए। चित्रण के लिए आगे पढ़ें।

नीचे के सत्र में, टॉडोस और डिडोस एक उपयोगिता (उबंटू पर उपलब्ध पैकेज के रूप में tofrodos) हैं, जो लाइन-एंडिंग कन्वेंशन को सीआर-एलएफ से एलएफ में परिवर्तित करते हैं। कोई भी समान उपयोगिता ( यह यूनिक्स देखें। प्रश्न ) प्रदर्शन के उद्देश्य के लिए क्या करेंगे।

निम्नलिखित सत्र प्रतिलेख (आपकी समान स्क्रिप्ट फ़ाइलों के साथ निष्पादित) को स्थिति स्पष्ट करनी चाहिए:

$ fromdos hello.sh
$ ./hello.sh
Hello
$ todos hello.sh
$ ./hello.sh
bash: ./hello.sh: /bin/sh^M: bad interpreter: No such file or directory
$
$ fromdos hello.py
$ ./hello.py
Hello
$ todos hello.py
$ ./hello.py
: No such file or directory
$

ऐसा लगता है कि यह कर्नेल है जो शेबंग लाइन को पढ़ता है, और जाहिर तौर पर लिनक्स कर्नेल (कम से कम मेरे कुबंटु सॉसी सिस्टम पर संस्करण के रूप में) सीआर को सीआर-एलएफ लाइन के समापन सम्मेलन के हिस्से के रूप में नहीं पहचानता है।

यदि आपकी स्क्रिप्ट का शेबंग काम नहीं कर रहा है (यानी स्क्रिप्ट काम पर दुभाषिया को मैन्युअल रूप से कॉल करता है लेकिन आप इसके फ़ाइल नाम का उपयोग करके स्क्रिप्ट को निष्पादित नहीं कर सकते हैं, भले ही आपने उस पर काम किया chmod +xहो) तो यह एक संभावित कारण है।

ध्यान दें: अन्य लोगों के लिए भी जिन्होंने टिप्पणी की। मुझे यह सुनकर खुशी होगी कि क्या बेहतर उत्तर हैं!

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