बैश स्क्रिप्ट खाली लाइनों पर "कमांड नॉट फाउंड" को प्रिंट करती है


111

हर बार जब मैं bash scriptname.shडेबियन में कमांड लाइन से एक स्क्रिप्ट का उपयोग करता हूं, तो मुझे मिलता है Command Not foundऔर फिर स्क्रिप्ट का परिणाम होता है।

स्क्रिप्ट काम करती है लेकिन Command Not Foundप्रत्येक खाली लाइन के लिए स्क्रीन पर हमेशा एक स्टेटमेंट छपा होता है। प्रत्येक रिक्त पंक्ति के परिणामस्वरूप एक कमांड पाया जाता है।

मैं स्क्रिप्ट को /varफ़ोल्डर से चला रहा हूं ।

यहाँ स्क्रिप्ट है:

#!/bin/bash

echo Hello World

मैं इसे निम्न लिखकर चलाता हूं:

bash testscript.sh

ऐसा क्यों होगा?


गंभीरता से, नेट ऐसी शिकायतों से भरा है। शेल बहुत कमजोर है और लंगड़ा दुभाषिया है। यहाँ और वहाँ थोड़ा और यह विफल रहता है। आपको स्क्रिप्ट में सभी सफेद स्थान भी देखने को मिले। अदृश्य रेखा फ़ीड वर्ण के कारण मेरी स्क्रिप्ट विफल हो रही थी। संभवतः यह केवल स्क्रिप्टिंग भाषा है जहां सफेद रिक्त स्थान मायने रखते हैं!
अतुल

1
bash -x scriptname.shत्रुटि का पता लगाने के लिए उपयोग करें । - मेरे मामले में यह VSCode और लाइन एंडिंग के साथ विंडोज के तहत "CRLF" के रूप में सहेजी गई एक श-फाइल थी। निचले दाएं कोने में VSCode में आप "CRLF" से "LF" तक लाइन टर्मिनेटर को बदल सकते हैं। इस फ़ाइल को अपलोड किया और अंत में इसके साथ निष्पादित कर सकता है bash scriptname.sh
काई नैक

यह निश्चित रूप से stackoverflow.com/questions/39527571/… का एक डुप्लिकेट है, लेकिन यहां कई उत्तर कई अन्य स्थितियों की व्याख्या करते हैं जहां आपको अन्य कारणों से "कमांड नहीं मिली"। आगंतुकों को सभी उत्तरों को पढ़ने की सलाह दी जाती है यदि आपकी समस्या विशेष रूप से खाली लाइनों के बारे में नहीं है।
ट्रिपल

जवाबों:


161

सुनिश्चित करें कि आपकी पहली पंक्ति है:

#!/bin/bash

यदि यह नहीं है तो अपने रास्ते को बंद करने के लिए दर्ज करें /bin/bash


चलाने की कोशिश करें:

dos2unix script.sh

विंडोज से यूनिक्स फॉर्मेट में wil कन्वर्ट लाइन एंडिंग्स आदि। यानी यह स्ट्रिप्स \ r (सीआर) लाइन अंत से उन लोगों से बदलने के लिए \r\n (CR+LF)करने के लिए \n (LF)

dos2unixकमांड के बारे में अधिक जानकारी (मैन पेज)


यह बताने का एक और तरीका कि क्या आपकी फ़ाइल dos / Win प्रारूप में है:

cat scriptname.sh | sed 's/\r/<CR>/'

आउटपुट कुछ इस तरह दिखाई देगा:

#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>

यह फ़ाइल में <CR>प्रत्येक \rवर्ण के लिए पूरे फ़ाइल पाठ को आउटपुट करेगा ।


यह आवश्यक नहीं है क्योंकि वह इसे सीधे चला रहा है bash scriptname.sh(लेकिन यह अभी भी अच्छा अभ्यास है, निश्चित रूप से)।
पैक्सडीब्लो

1
हाय #! / बिन / बाश मेरी स्क्रिप्ट की पहली पंक्ति है
डेविड

1
@chown - मैक पर मेरे पास यही मुद्दा था। मैं इस पोस्ट पर ठोकर खाई। मुझे यकीन नहीं है कि इससे ओपी को मदद मिली या नहीं। लेकिन आपके समाधान ने मेरी मदद की।
प्रशांत

1
धन्यवाद। यह वही मुद्दा था जिसका मैं सामना कर रहा था। यह जवाब उसे काम कर गया।
slayedbylucifer

5
ड्राइव करते समय आप एक प्रोग्रामिंग प्रश्न का उत्तर कैसे लिख सकते हैं?
उमर तारिक

61

आप bash -x scriptname.shइसे ट्रेस करने के लिए उपयोग कर सकते हैं ।


47

मैं भी इसी तरह के मुद्दे पर भाग गया। समस्या अनुमतियाँ लगती है। यदि आप ऐसा करते हैं ls -l, तो आप यह पहचानने में सक्षम हो सकते हैं कि आपकी फ़ाइल में निष्पादित बिट चालू नहीं हो सकती है। यह स्क्रिप्ट को निष्पादित करने की अनुमति नहीं देगा। :)

जैसा कि @artooro ने टिप्पणी में जोड़ा है:

उस समस्या को ठीक करने के लिए चलाएँ chmod +x testscript.sh


4
उस समस्या को ठीक करने के लिएchmod +x testscript.sh
आर्टूरो

यह वह उत्तर था जो मेरे लिए काम करता था, हमेशा कहा जाता था कि मेरे पास अनुमति नहीं है, इसलिए मैंने इसे सूद दिया और कहा गया कि कमान नहीं मिली। मैं अनुमतियों की जाँच करने के लिए नहीं सोचा था।
डायमंडड्रैक

1
धन्यवाद Lypso345, इसने मेरे पास मौजूद समस्या को हल किया।
amills01

chmod 777 testcript.sh FTW
GeneCode

16

यह तुच्छ हो सकता है और ओपी के सवाल से संबंधित नहीं हो सकता है, लेकिन मैंने अक्सर शुरुआत में यह गलती की थी जब मैं स्क्रिप्टिंग सीख रहा था

VAR_NAME = $(hostname)
echo "the hostname is ${VAR_NAME}"  

यह 'आदेश नहीं मिला' प्रतिक्रिया का उत्पादन करेगा। रिक्त स्थान को खत्म करने का सही तरीका है

VAR_NAME=$(hostname)

11

यदि स्क्रिप्ट अपना काम (अपेक्षाकृत) अच्छी तरह से करती है, तो यह ठीक चल रहा है। आपकी समस्या शायद फ़ाइल में एक एकल पंक्ति है जो एक प्रोग्राम को संदर्भित करती है जो या तो रास्ते पर नहीं है, स्थापित नहीं है, गलत वर्तनी या कुछ समान है।

एक तरीका यह है set -xकि अपनी स्क्रिप्ट के शीर्ष पर रखें या इसे bash -xकेवल के बजाय इसके साथ चलाएं bash- यह लाइनों को निष्पादित करने से पहले आउटपुट करेगा और आपको आमतौर पर कमांड आउटपुट को तुरंत देखने की आवश्यकता है, त्रुटि देखने से पहले।

, तो के रूप में आप कहते हैं, यह रिक्त लाइनों समस्याओं के कारण, तुम क्या actaully है जांच करना चाह सकते है में उन्हें। Daud:

od -xcb testscript.sh

और सुनिश्चित करें कि आपके पास CTRL-M(कैरिज रिटर्न) जैसा कोई "अदृश्य" मज़ेदार चरित्र नहीं है, जो कि आप विंडोज-प्रकार के संपादक का उपयोग करके प्राप्त कर सकते हैं।


'ओड' कमांड के लिए +1! यह अच्छा है, मुझे इसके बारे में पता नहीं था! धन्यवाद!
chown

11

विंडोज के लिए बैश पर मैंने गलत तरीके से चलाने की कोशिश की है

run_me.sh 

बिना ./ शुरुआत में और एक ही त्रुटि मिली।

विंडोज पृष्ठभूमि वाले लोगों के लिए सही रूप निरर्थक लगता है:

./run_me.sh



6

उदाहरण के लिए, आपको उसका पूरा मार्ग प्रदान करना चाहिए

/home/Manuel/mywrittenscript

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

विंडोज एक्सटेंशन के विपरीत .in लिनक्स फाइल सिस्टम का उपयोग केवल नाम के एक भाग के रूप में किया जाता है और फ़ाइल की सामग्री के बारे में कुछ भी नहीं कहा जाता है। मुझे मेरे मामले में बाधा नहीं कहना चाहिए ।
मसूद मोघिनी 10

6

यदि आपके पास नोटपैड ++ है और आपको यह .sh त्रुटि संदेश मिलता है: "कमांड नहीं मिला" या यह ऑटोकॉनफ़ त्रुटि संदेश "लाइन 615: ../../autoconf/bin/autom4te: ऐसी कोई फ़ाइल या निर्देशिका नहीं है"

अपने नोटपैड ++ पर, संपादित करें -> ईओएल रूपांतरण पर जाएं और फिर मैकिंथोस (सीआर) की जांच करें । यह आपकी फ़ाइलों को संपादित करेगा। मैं इस आदेश के साथ सभी फ़ाइलों की जांच करने के लिए भी प्रोत्साहित करता हूं, क्योंकि जल्द ही ऐसी त्रुटि होगी।


इसके लिए धन्यवाद। मेरे मामले के लिए मैं बिजीबॉक्स लाइनक्स डिस्ट्रो पर स्क्रिप्ट चला रहा था। मेरी स्क्रिप्ट्स में सभी खाली लाइनों में समान त्रुटि "नहीं मिली"। यह भी समस्या है अगर / और बयान के साथ। नोटपैड ++ में ईओएल को बदलकर यूनिक्स को तय किया।
जिनेकोड

4

एक ही समस्या थी। दुर्भाग्य से

dos2unix winfile.sh
bash: dos2unix: command not found

इसलिए मैंने इसे रूपांतरित करने के लिए किया।

 awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh

और फिर

bash unixfile.sh

2

स्क्रिप्ट चलाने के साथ समस्याएँ मल्टी-लाइन कमांड के खराब स्वरूपण से भी जुड़ी हो सकती हैं, उदाहरण के लिए यदि आपके पास लाइन-ब्रेकिंग "\" के बाद एक व्हाट्सएप चरित्र है। जैसे यह:

./run_me.sh \ 
--with-some parameter

(कृपया "\" के बाद अतिरिक्त स्थान पर ध्यान दें) समस्या पैदा करेगा, लेकिन जब आप उस स्थान को हटा देंगे, तो यह पूरी तरह से ठीक हो जाएगा।


0

मुझे भी कुछ हो रहा था Cannot execute command। सब कुछ सही लग रहा था, लेकिन वास्तव में मैं &nbsp;अपनी आज्ञा से ठीक पहले एक न टूटने वाला स्थान पा रहा था, जो नग्न शरीर के साथ स्पॉट करना असंभव था:

if [[ "true" ]]; then
  &nbsp;highlight --syntax js "var i = 0;"
fi

जो, विम में, जैसा दिखता था:

if [[ "true" ]]; then
  highlight --syntax js "var i = 0;"
fi

बैश स्क्रिप्ट चेकर चलाने के बाद shellcheckही मुझे समस्या का पता चला।


shellcheckऑन-लाइन उपलब्ध है, हालांकि आपको निश्चित रूप से मदद करने के लिए अपनी स्क्रिप्ट को कॉपी-पेस्ट करना होगा। shellcheck.net
ट्रिपल

0

मैं आज इस में भाग गया, अनुपस्थित रूप $से स्क्रिप्ट में डॉलर कमांड प्रॉम्प्ट (एक कमांड स्ट्रिंग से आगे) की नकल कर रहा था ।


-1

एक निर्देशिका निष्पादित करने में सक्षम होने के लिए PATH में वर्तमान निर्देशिका (।) जोड़ें, बस इसके नाम में टाइप करके, जो वर्तमान निर्देशिका में रहता है:

PATH=.:$PATH

1
इसे सुरक्षा भेद्यता माना जाता है। अपने पेट को जोड़ नहीं है .
गनीउरफ_गनीउरफ

स्पष्टीकरण क्यों यह "उत्तर" एक बुरा विचार है: superuser.com/questions/156582/…
jmng

-1

आप जो कमांड दर्ज कर रहे हैं उसे पहचानने के लिए आप .bashrc और .bash_profile फ़ाइलों को उपनामों के साथ अपडेट कर सकते हैं।

.bashrc और .bash_profile फाइलें छिपी हुई फाइलें हैं जो संभवत: आपके C: ड्राइव पर स्थित हैं, जहां आप अपनी प्रोग्राम फाइलों को सहेजते हैं।

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