#! / बिन / बैश - ऐसी कोई फ़ाइल या निर्देशिका नहीं


69

मैंने एक बैश स्क्रिप्ट बनाई है, लेकिन जब मैं इसे निष्पादित करने की कोशिश करता हूं, तो मुझे मिलता है

#!/bin/bash no such file or directory

मुझे कमांड चलाने की आवश्यकता है: bash script.shइसके लिए काम करना है।

मैं इसे कैसे ठीक करूं?


मेरे पास अब यह मुद्दा है कि मैं एक पटकथा के साथ साइबरविन के तहत पहले से ही समस्याओं के बिना चल सकता था। मैंने सभी उत्तरों की जाँच की, लेकिन कोई भी उचित नहीं लगता। अन्य सवालों और जवाबों में भी 32/64 बिट मुद्दों का उल्लेख किया गया है, लेकिन शेल स्क्रिप्ट के लिए इसे बाहर रखा जा सकता है, है ना?
जनवरी

मिली हो, नई anwer में विवरण जोड़ा unix.stackexchange.com/a/450389/62636 मामले किसी में भी इस्तेमाल किया गया है #!/usr/bin/env bashके बजाय #!/bin/bashऔर भी ... यहाँ देख
जनवरी

जवाबों:


100

इस तरह का संदेश आमतौर पर एक फर्जी शेबंग लाइन के कारण होता है, या तो पहली पंक्ति के अंत में एक अतिरिक्त गाड़ी वापस आती है या इसकी शुरुआत में एक बीओएम।

Daud:

$ head -1 yourscript | od -c

और देखें कि यह कैसे समाप्त होता है।

ये गलत है:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

यह भी गलत है:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

यह सही है:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

का प्रयोग करें dos2unix(या sed, tr, awk, perl, python...) अपनी स्क्रिप्ट ठीक करने के लिए अगर यह समस्या है।

यहाँ एक BOM और सिलाई CRs दोनों को हटा दिया जाएगा:

sed -i '1s/^.*#//;s/\r$//' brokenScript


ध्यान दें कि स्क्रिप्ट को चलाने के लिए आप जिस शेल का उपयोग कर रहे हैं, वह प्रदर्शित होने वाले त्रुटि संदेशों को थोड़ा प्रभावित करेगा।

यहाँ तीन लिपियों को केवल अपना नाम दिखाया गया है ( echo $0) और निम्नलिखित संबंधित शबंग रेखाएँ हैं:

correctScript:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithBom:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithCRLF:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

बैश के तहत, उन्हें चलाने से ये संदेश दिखाई देंगे:

$ ./correctScript
./correctScript
$ ./scriptWithCRLF
bash: ./scriptWithCRLF: /bin/bash^M: bad interpreter: No such file or directory
$ ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

किसी दुभाषिये को बुलाकर फर्जी तरीके से चलाना CRLF स्क्रिप्ट को बिना किसी समस्या के चलाने की अनुमति देता है:

$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

इस प्रकार देखा गया व्यवहार kshनिम्न है:

$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom

और इसके साथ dash:

$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom

2
यदि यह समस्या है तो खुलासा करने का एक और तरीका है hexdump -C yourscript | head -n 1। मैं अभी भी dos2unix yourscriptइसे ठीक करने के लिए उपयोग करूंगा ।
केविन एम

हाँ, यह बहुत अच्छी तरह से हो सकता है। मैंने खिड़कियों पर संपादन किया। टिप के लिए चीजें।
निकोलस डी फोंटने डे

1
यदि यह एक CRLF समस्या थी, तो आपको एक #!/bin/bash no such file or directoryत्रुटि संदेश दिखाई नहीं देगा , क्योंकि कोई कारण नहीं है कि कुछ भी निष्पादित या खोलने का प्रयास करेगा #!/bin/bash। यह /bin/bash<CR>निष्पादित किया जाएगा।
स्टीफन चेजलस

1
@StephaneChazelas जैसा कि dos2unix ने समस्या को ठीक किया, इसमें कोई संदेह नहीं है कि यह CRLF समस्या नहीं थी। त्रुटि संदेश शायद गलत तरीके से ट्रांसक्रिप्ट किया गया था ..
jlliagre

6
dos2unixएक UTF-8 BOM भी निकालता है। एक UTF-8 BOM त्रुटि संदेश समझा सकता है।
स्टीफन चेजलस

17

यह UTF-8 स्क्रिप्ट में BOM के कारण भी हो सकता है। यदि आप विंडोज़ में स्क्रिप्ट बनाते हैं तो कभी-कभी आपको फ़ाइल की शुरुआत में कुछ कबाड़ मिल जाता है।


बीओएम को आसानी से awk का उपयोग करके हटाया जा सकता है, जैसा कि stackoverflow.com/questions/1068650/… में
13:32 बजे puxu

1
ध्यान दें कि Mac के लिए Visual Studio एक BOM सम्मिलित करेगा।
स्पष्ट

9

असल में, बैश स्क्रिप्ट के लिए सही शेबंग यह है:

#!/usr/bin/env bash

क्योंकि, freeBSD में, bash में स्थित है /usr/local/bin/bash


13
"सही" ऐसे मामलों में उपयोग करने के लिए एक कठिन शब्द है। शायद एक बेहतर वाक्यांश "कम त्रुटि-प्रवण" होगा।
हालोसगॉस्ट

1
यह भी भयानक है; यह धारणा कि / usr मौजूद है, एक बुरा IMO है। उदाहरण के लिए, हाइकु में / usr नहीं है।
jessicah

9

यदि आप मौजूद हैं तो आप दोनों समस्याओं को ठीक करने के लिए vi का उपयोग कर सकते हैं:

vi <your_file>
:set ff=unix
:set nobomb
:wq

उत्तर यथासंभव स्व-निहित होना चाहिए। प्रश्न में दो समस्याओं का उल्लेख नहीं है; यदि आप अन्य उत्तरों पर निर्माण करने जा रहे हैं, तो आपको कम से कम यह कहना चाहिए कि वे क्या हैं। बेहतर अभी तक, आपको यह बताना चाहिए कि यह प्रश्न का उत्तर कैसे देता है।
जी-मैन

अधिक विंडोज़ टूल डाउनलोड किए बिना बहुत जल्दी ठीक, धन्यवाद!
21

1
@ G-Man अन्य उत्तर पहले से ही इस बात का उल्लेख बेहतर तरीके से करते हैं कि मैं इसमें जाना चाहता हूं। दोहराने की आवश्यकता नहीं है, लेकिन यदि यह स्पष्ट रूप से स्पष्ट नहीं है, तो आपके पास एक विन्डोज़ लाइन समाप्त हो सकती है और एक छिपा हुआ विंडोज बॉम चरित्र हो सकता है। मुझे लगता है कि बहुत से लोग जो जवाब स्कैन कर रहे हैं, स्वयं निहित होने के बजाय संक्षिप्तता की सराहना करते हैं, खासकर जब अन्य उत्तरों में बहुत अधिक विवरण होता है।
cwash

4

यदि आपके पास dos2unix नहीं है, तो यह इस समस्या को ठीक करने का एक तरीका है।

cp script _p4 && tr -d '\r' < _p4 > script && rm _p4

3

बाइट-ऑर्डर मार्क (BOM)

यह BOM के कारण हो सकता है। विकिपीडिया से, एक बीओएम एक है

बाइट ऑर्डर मार्क (BOM) एक यूनिकोड वर्ण है, U + FEFF बाइट ऑर्डर मार्क (BOM), जिसकी उपस्थिति एक टेक्स्ट स्ट्रीम की शुरुआत में मैजिक नंबर के रूप में दिखाई देती है, जो टेक्स्ट का उपभोग करने वाले प्रोग्राम की कई चीजों का संकेत दे सकता है।

दुर्भाग्य से, यह लिनक्स कर्नेल के लिए कुछ भी संकेत नहीं करता है जो कि शी-बैंग लाइन को संभालता है। आप सत्यापित कर सकते हैं कि आपके पास उपयोग करके BOM है file,

file /tmp/foo 
/tmp/foo: UTF-8 Unicode (with BOM) text

या आप पहले कुछ पात्रों को हेक्सपम्प कर सकते हैं और देख सकते हैं कि क्या वे किसी भी BOM अक्षर से मैन्युअल रूप से मेल खाते हैं

जैसे ही आप उन्हें इस तरह जानते हैं, आप BOM वर्णों को हटा सकते हैं,

sed -i '1 s/^\xef\xbb\xbf//' *.txt

0

मेरे पास गलती से एक गलत बैश को जोड़कर मुद्दा था PATHक्योंकि और मेरी स्क्रिप्ट में अधिक लचीली #!/usr/bin/env bashशेबंग का उपयोग किया गया था (पथ से पहला बैश निष्पादन योग्य ले लो)।

command -v bash
/cygdrive/c/Program Files/Git/bin//bash

मैंने विंडोज के लिए cygwinजीआईटी को विंडोज जीआईटी जीयूआई के साथ मिलकर काम करने के लिए स्थापित किया है (साइबरविन देशी गिट के साथ काम नहीं कर रहा था ...)। मैंने अब इसे हल कर लिया है कि #!/bin/bashशीबाड पर स्विच करके और खिड़कियों के लिए जीआईटी हटा दें PATH


-3

प्रयत्न, कोशिश #!/bin/bash

दूसरी बात: find / -name bash
तीसरी बात:ls -al /bin/bash


या बस which bash। हम जानते हैं कि यह एक मिल रहा है क्योंकि यह साथ काम कर रहा है bash script.sh
केविन

सच। और जैसा कि उल्लेख किया गया है, आपके लिए एक प्रोग्राम बैश (या एक अन्य दुभाषिया) खोजने के लिए बहुत अधिक पोर्टेबल / यूएसआर / बिन / एनवी विधि है। एक पीएएच को हार्डकोड करने की आवश्यकता नहीं है।
हेन्नेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.