बैश: सिंटैक्स त्रुटि: पुनर्निर्देशन अप्रत्याशित


138

मैं यह एक स्क्रिप्ट में करता हूं:

read direc <<< $(basename `pwd`)

और मुझे मिलता है:

Syntax error: redirection unexpected

एक ubuntu मशीन में

/bin/bash --version
GNU bash, version 4.0.33(1)-release (x86_64-pc-linux-gnu)

जब तक मुझे दूसरी सॉसेज मशीन में यह त्रुटि नहीं मिलती है:

/bin/bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

त्रुटि क्यों?


संदर्भ के लिए, कमांड साइबरविन पर भी काम करता है (/ बिन / बैश --version GNU bash, संस्करण 3.2.49 (23) -release (i686-pc-cygwin) कॉपीराइट (C) 2007 फ्री सॉफ्टवेयर फाउंडेशन, इंक।
१३:१० बजे

जवाबों:


243

क्या आपकी स्क्रिप्ट का संदर्भ /bin/bashया /bin/shइसकी हैश बैंग लाइन में है? उबंटू में डिफ़ॉल्ट सिस्टम शेल डैश है , बैश नहीं है , इसलिए यदि आपके पास है #!/bin/shतो आपकी स्क्रिप्ट आपकी अपेक्षा से भिन्न शेल का उपयोग करेगी। डैश में <<<पुनर्निर्देशन ऑपरेटर नहीं है ।


14

डोकर:

मेरे पास मेरे डॉकरीफाइल से यह समस्या आ रही थी:

RUN bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

हालांकि, इस मुद्दे के अनुसार , इसे हल किया गया था:

कार्यकारी प्रपत्र यह खोल स्ट्रिंग munging से बचने के लिए संभव है, और के लिए बनाता है RUN एक आधार छवि है कि शामिल नहीं है का उपयोग कर आदेशों /bin/sh

ध्यान दें

एक अलग शेल का उपयोग करने के लिए, अन्य के अलावा /bin/sh, वांछित शेल में पास होने वाले निष्पादन फॉर्म का उपयोग करें । उदाहरण के लिए,

RUN ["/bin/bash", "-c", "echo hello"]

उपाय:

RUN ["/bin/bash", "-c", "bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)"]

प्रत्येक पैरामीटर के चारों ओर उद्धरण देखें ।


14

यदि आप अपनी स्क्रिप्ट चलाने के लिए निम्नलिखित का उपयोग कर रहे हैं:

sudo sh ./script.sh

तो आप इसके बजाय निम्नलिखित का उपयोग करना चाहते हैं:

sudo bash ./script.sh

इसका कारण यह है कि बैश उबंटू के लिए डिफ़ॉल्ट शेल नहीं है। इसलिए, यदि आप "श" का उपयोग करते हैं तो यह केवल डिफ़ॉल्ट शेल का उपयोग करेगा; जो वास्तव में डैश है। यह तब होगा जब आप #!/bin/bashअपनी स्क्रिप्ट के शीर्ष पर हों। परिणामस्वरूप, आपको bashऊपर दिखाए अनुसार उपयोग करने के लिए स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता होगी , और आपकी स्क्रिप्ट अपेक्षित रूप से चलना चाहिए।

डैश बैश के समान रीडायरेक्ट नहीं करता है।


6

आप उस आदेश का आउटपुट प्राप्त कर सकते हैं और उसे एक चर में डाल सकते हैं। तो उपयोग करें heredoc। उदाहरण के लिए:

nc -l -p 80 <<< "tested like a charm";

इस तरह लिखा जा सकता है:

nc -l -p 80 <<EOF
tested like a charm
EOF

और इस तरह (यह वही है जो आप चाहते हैं):

text="tested like a charm"
nc -l -p 80 <<EOF
$text
EOF

में व्यावहारिक उदाहरण busyboxके तहत dockerकंटेनर:

kasra@ubuntu:~$ docker run --rm -it busybox
/ # nc -l -p 80 <<< "tested like a charm";
sh: syntax error: unexpected redirection


/ # nc -l -p 80 <<EOL
> tested like a charm
> EOL
^Cpunt!       => socket listening, no errors. ^Cpunt! is result of CTRL+C signal.


/ # text="tested like a charm"
/ # nc -l -p 80 <<EOF
> $text
> EOF
^Cpunt!

... या echo 'text' | ncजो छोटा है।
दर्शन

2

यह सरल तरीका है,

direc=$(basename `pwd`)

या शेल का उपयोग करें

$ direc=${PWD##*/}

1

त्रुटि का एक और कारण हो सकता है यदि आप एक क्रॉन जॉब चला रहे हैं जो एक तोड़फोड़ की कार्य प्रति को अपडेट करता है और फिर एक संस्करण स्क्रिप्ट चलाने का प्रयास किया है जो अपडेट के बाद एक विवादित स्थिति में था ...


1

मेरी मशीन पर, यदि मैं सीधे स्क्रिप्ट चलाता हूं, तो डिफ़ॉल्ट है bash

अगर मैं इसे चलाता हूं sudo, तो डिफ़ॉल्ट है sh

इसलिए मैं इस समस्या को मार रहा था जब मैंने उपयोग किया था sudo


0

मेरे मामले में त्रुटि इसलिए है क्योंकि मैंने दो बार ">>" डाला है

mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> >> $LOG_PATH

मैं इसे सही करता हूं

mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> $LOG_PATH

0

स्क्रिप्ट चलाने से पहले, आपको दुभाषिया के लिए शेल स्क्रिप्ट की पहली पंक्ति की जांच करनी चाहिए।

जैसे: यदि स्क्रिप्ट / बिन / बैश के साथ शुरू होती है, तो स्क्रिप्ट को नीचे कमांड "बैश script_name.sh" का उपयोग करके चलाएं

यदि स्क्रिप्ट / बिन / श से शुरू होती है, तो नीचे दिए गए कमांड "sh script_name.sh" का उपयोग करके स्क्रिप्ट चलाएं

./sample.sh - यह स्क्रिप्ट की पहली पंक्ति से दुभाषिया का पता लगाएगा और चलाएगा।

अलग-अलग लिनक्स डिस्ट्रीब्यूशन डिफॉल्ट के रूप में अलग-अलग शेल होते हैं।


1
यद्यपि हम आपके उत्तर के लिए धन्यवाद देते हैं, लेकिन बेहतर होगा यदि वह अन्य उत्तरों के शीर्ष पर अतिरिक्त मूल्य प्रदान करे। इस मामले में, आपका उत्तर अतिरिक्त मूल्य प्रदान नहीं करता है, क्योंकि कोई अन्य उपयोगकर्ता पहले से ही उस समाधान को पोस्ट करता है। यदि पिछला उत्तर आपके लिए उपयोगी था, तो आपको उसी जानकारी को दोहराने के बजाय उसे वोट देना चाहिए।
टोबी स्पाइट

क्या आपको नहीं लगता कि मैंने एक उदाहरण के साथ इसका समाधान समझाया है?
सिजेश

क्या यहां ऐसा कुछ भी है जो 8 साल पहले लिखे गए जॉन कुगेलमैन के उत्तर में पर्याप्त रूप से कवर नहीं किया गया है?
टोबी स्पाइट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.