शेल स्क्रिप्ट विफल: सिंटैक्स त्रुटि: "(" अप्रत्याशित


64

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

kemra102@ubuntuvm:~$ sudo ./pi_dev_env_install.sh

यह उम्मीद के मुताबिक ठीक काम करता है और इस बिंदु तक अधिकांश तरीके से पहुंच जाता है:

./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected

अब इस लाइन ने पहले ठीक काम किया जब पूरे स्क्रिप्ट को सुडो के साथ नहीं चलाया गया। सूडो के रूप में चलने वाली इस लाइन के बारे में कुछ भी नहीं है जो इसे मेरी जानकारी के लिए काम करना बंद कर दे, क्या किसी के पास कोई विचार है?


1
शेबंग वास्तव में 9 लाइन में है? उबंटू के डैशएबिन आत्मीयता के कारण मुझे संदेह है कि आपकी स्क्रिप्ट की dashबजाय इसके द्वारा व्याख्या की गई है bash
शेबबैंग

उस लेख के अनुसार / बिन / श वसीयत के बजाय सीधे कॉल / बिन / बैश; सही तरीके से डैश के बजाय बैश का उपयोग करें ताकि मुझे यह समझने में कोई समस्या न हो। मैं अभी भी निश्चित रूप से शेबंग को स्थानांतरित कर सकता हूं, लेकिन यह वास्तव में नहीं समझाता है कि जब आप पूरी स्क्रिप्ट को सूडो नहीं करते हैं तो यह क्यों काम करता है।
kemra102

मेरे मामले में सब कुछ ठीक था लेकिन एक आदत के रूप में, मैं "श" के साथ "बैश" के साथ अपनी शेल स्क्रिप्ट चला रहा था।
इंद्रजीत गौर

जवाबों:


82

स्क्रिप्ट एक शेबंग रेखा से शुरू नहीं होती है, इसलिए सिस्टम इसे निष्पादित करता है /bin/sh। उबंटू में, पानी/bin/sh का छींटा है , एक शेल जो तेज स्टार्टअप और केवल मानक सुविधाओं के साथ निष्पादन के लिए डिज़ाइन किया गया है। जब डैश 68 रेखा पर पहुंचता है, तो यह एक सिंटैक्स त्रुटि देखता है: कि कोष्ठक के संदर्भ में इसका कोई मतलब नहीं है।

चूंकि डैश (सभी अन्य गोले की तरह) एक दुभाषिया है, यह तब तक शिकायत नहीं करेगा जब तक निष्पादन समस्याग्रस्त रेखा तक नहीं पहुंचता। इसलिए यदि स्क्रिप्ट आपके परीक्षण के कुछ बिंदु पर सफलतापूर्वक शुरू हो जाती है, तो यह एक बार 68 तक पहुंच जाने के बाद समाप्त हो जाएगी।

फ़ाइल में शेबबैंग लाइन सबसे पहली चीज़ होनी चाहिए। चूंकि आप बैश सुविधाओं का उपयोग करते हैं, फ़ाइल की पहली पंक्ति #!/bin/bashया होनी चाहिए #!/usr/bin/env bash


2
धन्यवाद मेरे ज्ञान में स्पष्ट रूप से एक अंतर है, मैं स्क्रिप्ट नहीं करता हूं, इसलिए इसके बारे में पता नहीं था! स्पष्टीकरण के लिए धन्यवाद यह बहुत मदद करता है और भविष्य में भी जानना बहुत उपयोगी होगा।
kemra102

मुझे जोड़ने दें कि यह त्रुटि नॉटिलस के लिए स्क्रिप्ट एक्सटेंशन का उपयोग करते समय भी होती है। शेबबैंग लाइन को जोड़ने से इसे तुरंत हल किया गया। +1।
भाविन दोशी

समस्या का सामना करते sonarqube.shहुए Ubuntu 15.10 पर चल रहा है । जैसा कि हेडर ने कहा। निष्पादन हो रहा है sudo sh ./sonar.sh console। फिर भी त्रुटि हो रही है।
सूपरफ़र्क

@soufrk है sonarqube.shया sonar.sh? मन बना लो। और वैसे भी, यदि आप इस थ्रेड में जानकारी के साथ समस्या को हल नहीं कर सकते हैं, तो स्क्रिप्ट की पूरी सामग्री के साथ एक नया प्रश्न पूछें और पूर्ण त्रुटि संदेश (ओं) को कॉपी-पेस्ट करें।
गिल्स

मेरी गलती !! गलत आर्च निष्पादन योग्य था। लेकिन दिलचस्प है, सही आर्च पर फ़ाइल #! /bin/shपूरी तरह से निष्पादित के साथ शुरुआत । अब, कि मुझे हैरान कर दिया।
--frfr।।।।।।।।।

6

यदि शेलबंग पहली पंक्ति पर नहीं है, तो इसका सम्मान नहीं किया जाएगा, रूट उपयोगकर्ता के शेल, SHELLचर या -sध्वज की परवाह किए बिना । आप आसानी से इसकी पुष्टि कर सकते हैं कि यह एक सरल उदाहरण है:

#
#!/bin/bash
offfset=(`ls`)
echo $offset

सूडो के साथ इस स्क्रिप्ट को चलाना उबंटू और डेबियन के हाल के संस्करणों में एक वाक्यविन्यास त्रुटि को बढ़ाएगा।

आपके पास यह सुनिश्चित करने के लिए दो विकल्प हैं कि स्क्रिप्ट की व्याख्या किसने की bash:

  1. शेबंग को पहली पंक्ति में ले जाएं

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

    sudo bash ./pi_dev_env_install.sh

1

मेरे लिए स्क्रिप्ट शुरू करना:

bash ./< script file > 

ठीक काम करता है।


यह आपके लिए सही हो सकता है, लेकिन यह वास्तव में बताई गई समस्या का हल नहीं है।
bu5hman

0

हो सकता है कि आपके पास dir या फ़ाइल नाम पर एक "" हो।


0

स्क्रिप्ट फ़ाइल में dos2unix आज़माएं। कभी-कभी कुछ छिपे हुए पात्र स्रोत में होते हैं।

आदेश:

dos2unix script_file.sh script_file.sh

0

यदि आप इच्छित दुभाषिया को ओवरराइड करते हैं तो ऐसा हो सकता है। उदाहरण के लिए यह हैश बैंग का उपयोग किए बिना श के साथ चलेगा (हैश बैंग का उपयोग नहीं करते समय)

> sh run.sh

या बैश चलाने के लिए:

> bash run.sh

इसे स्क्रिप्ट को परिभाषित हैश बैंग मान का उपयोग करने देने के लिए, इसका उपयोग करें:

> ./run.sh

-1
sudo chmod 755 <script>

मेरे मामले में त्रुटि फ़ाइल को निष्पादित करने के लिए अनुमतियों की कमी थी। कमांड को अलग करने पर केवल त्रुटि संदेश मिला:

$ sudo sh
# ./install

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