बैश स्क्रिप्ट के साथ समस्या: 'घोषित: नहीं मिला'


23

मेरे पास एक स्क्रिप्ट थी जो ठीक चल रही थी लेकिन जब मैंने इसे आज चलाया, तो यह कहती है declare: not found। मैं स्क्रिप्ट के आरंभ में बैश शेल और पथ का उपयोग कर रहा हूं, यह सही है।

मेरी स्क्रिप्ट में दो ध्वजांकित लाइनें इस प्रकार हैं:

declare -a RESPONSE
RESPONSE=($RESULT)

यह भी (अप्रत्याशित है लेकिन मुझे लगता है कि पहली त्रुटि के कारण आ रहा है। जब मैं सीधे घोषणा करता हूं तो वर्थ उल्लेख बिंदु ठीक काम करता है।

declare | grep USER दिखाता है

USER=ashfame
USERNAME=ashfame
           values="$SVN_BASH_USERNAME";

तो, यहाँ क्या गलत है?

जवाबों:


27

क्या आप shइसके बजाय उपयोग कर रहे हैं bash? sh(से जुड़ा dash) declareकीवर्ड का समर्थन नहीं करता है , न ही सिंटैक्स

VAR=(list) 

सरणियों को शुरू करने के लिए।


मेरी शबंग रेखा #!/bin/bashही है। क्या आपका मतलब है कि मैं इसे कैसे निष्पादित करूं? मैं बस के रूप में इसे क्रियान्वित करने की कोशिश की ./script.shऔर यह काम किया। लेकिन यह काम नहीं करता है script.shया sh script.shमुझे पूरा यकीन है कि मैंने केवल बाद के दो तरीकों का उपयोग किया था जबकि मैंने इसे एक सप्ताह पहले बनाया था। वह क्या समझा सकता है?
अश्फाम

@Ashfame: शायद एक सप्ताह पहले यह याद पार्टी की योजना बनाई है कि तुम अब है, तो यह श script.sh साथ भी काम किया विशिष्ट सुविधाओं
enzotib

नहीं, मेरा मतलब था कि यह स्क्रिप्ट एक या दो सप्ताह पहले काम करती थी। या आपका मतलब है कि कुछ अपडेट ने बदलाव किया है?
अश्फाम

@Ashfame: मुझे नहीं पता, यह स्क्रिप्ट, जैसा कि आप अभी दिखाते हैं, sh script.sh के साथ काम नहीं कर सकती।
enzotib

11

मुझे संदेह है कि आपकी "Shebang" लाइन (फ़ाइल की वैकल्पिक पहली पंक्ति) के shबजाय संदर्भित है bash। यह होना चाहिए

#!/bin/bash

बैश स्क्रिप्ट के लिए। अगर आपकी स्क्रिप्ट की पहली लाइन है

#!/bin/sh

तब यह इंगित करेगा कि कड़ाई से बोर्न-संगत शेल का उपयोग किया जाना है; उबंटू के मामले में, dashउपयोग किया जाता है। कई अन्य वितरणों में, यह समस्या का कारण नहीं बनता है, क्योंकि वे लिंक /bin/shकरते हैं /bin/bash; हालाँकि, /bin/dashसिस्टम स्क्रिप्ट को अधिक तेज़ी से चलाने की अनुमति देने के लिए ubuntu लिंक करता है।

declareनिर्मित में से एक है bashबॉर्न शैल स्क्रिप्ट विनिर्देश के के कई एक्सटेंशन; dashएक्सटेंशन के बिना केवल विनिर्देश लागू करता है।


मेरी #!/bin/bash
शबंग

@Ashfame: आप स्क्रिप्ट कैसे चला रहे हैं? यदि आप इसे केवल स्क्रिप्ट का नाम लिखकर लागू कर रहे हैं, तो शेबबैंग लाइन यह निर्धारित करेगी कि दुभाषिया इसे क्या चलाता है। हालाँकि, यदि आप स्पष्ट रूप से इसके माध्यम से आह्वान करते हैं sh thescript.sh, तो shशेल - dashइसकी व्याख्या करेगा।
intuited

1
@ मेरे द्वारा इसे चलाया जा रहा था sh script.sh। मैंने समझा कि आपने क्या कहा, लेकिन मैंने कहीं पढ़ा है कि इस पद्धति के साथ, bashइसकी व्याख्या करेंगे। dashइसे यहां भूमिका क्यों मिलेगी ? क्या यह उबंटू के साथ ही है? हो सकता है कि मैंने जो पढ़ा था वह सामान्य रूप से लिनक्स के लिए था।
18

2
@Ashfame आपके साथ sh scriptकमांड shको तर्क के साथ चला रहा है script, जो उस फ़ाइल में कमांड को पढ़ने और निष्पादित करने में सक्षम बनाता है। शबंग को श द्वारा नहीं पढ़ा जाता है, यह एक के साथ शुरू होता है #, इसलिए इसे एक टिप्पणी के रूप में माना जाता है। यदि आप इसके बजाय भागते हैं ./script, तो कर्नेल #!/bin/bash/bin/bash ./script
शबंग को पढ़ेगा

@geirha हाँ thats कि यह कैसे मुझे पता है कि काम करता है लेकिन @intuited उल्लेख नहीं है कि dashउपयोग किया जाएगा, तो मैं यह स्पष्ट करने की आवश्यकता
Ashfame

3

उपरोक्त त्रुटि को कैसे पुन: पेश करें:

मैं Ubuntu 14.04 64 बिट का उपयोग कर रहा हूं। इस कोड को एक फ़ाइल में रखें:

#!/bin/sh 
declare -i FOOBAR=12; 
echo $FOOBAR; 

इसे इस तरह चलाएं:

el@apollo:~$ ./06.sh 
./test.sh: 2: ./test.sh: declare: not found

इसे ठीक करने के लिए, इसके बजाय यह करें:

#!/bin/bash
declare -i FOOBAR=12;
echo $FOOBAR;

प्रिंटों:

el@apollo:~$ ./06.sh 
12

1

मेरे पास एक ही मुद्दा था, और फिर मुझे याद आया कि आपको शेल स्क्रिप्ट को निष्पादित करने के लिए सही अनुमति प्रदान करने की आवश्यकता है।

उदाहरण के लिए, स्क्रिप्ट की अनुमति बदलें:

chmod 755 script.sh

1

/bin/bashइसके बजाय कमांड लाइन का उपयोग करके अपनी स्क्रिप्ट चलाने का प्रयास करें sh: (

के बजाय :

    sh script.sh

प्रयत्न :

    / बिन / बैश स्क्रिप्ट। श

1

उबंटू पर, आपके पास एक स्क्रिप्ट हो सकती है जो इसके भीतर अन्य स्क्रिप्ट को निष्पादित कर रही है, जिसे मैंने चलाया है।

some_dir/  
        | main.sh  
        | shhh.sh

#!/bin/bash -e

echo "file? $0"
# file? ./main.sh

echo "shell? $SHELL" 
# shell? /bin/bash

# sh shhh.sh
# file? shhh.sh
# shell? /bin/bash
# shhh.sh: 5: shhh.sh: declare: not found

$SHELL shhh.sh
# file? shhh.sh
# shell? /bin/bash
# foo? bar

#!/bin/bash -e

echo "file? $0"
# shhh.sh

echo "shell? $SHELL"
# shell? /bin/bash

declare foo="bar"

echo "foo? $foo"

सभी sh some_script.shको बदलकर $SHELL some_script.shइसे ठीक किया।

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