अप्रत्याशित टोकन के पास सिंटैक्स त्रुटि `('


15

जब मैं CentOS के लिए SSH टर्मिनल में नीचे दिए गए कोड का उपयोग करता हूं तो यह ठीक काम करता है:

paste <(printf "%s\n" "TOP")

लेकिन अगर मैं एक ही लाइन कोड को शेल स्क्रिप्ट (test.sh) में रखता हूं और टर्मिनल से शेल स्क्रिप्ट चलाता हूं, तो यह इस तरह से एरर फेंक देता है

./test.sh: line 30: syntax error near unexpected token ('   
./test.sh: line 30:     paste <(printf "%s\n" "TOP")

मैं इस समस्या को कैसे ठीक करुं?


कैसे वास्तव में आप इसे चला रहे हैं? क्या '#!' लाइन (यदि कोई हो) अपनी स्क्रिप्ट शुरू करता है? ऐसा लगता है कि आप एक शेल दुभाषिया का आह्वान कर रहे हैं जो उस सिंटैक्स का समर्थन नहीं करता है (जैसे कि dashइसके बजाय bash)।
स्टीलड्राइवर

मेरे पास #!/bin/shसबसे ऊपर है। मैं के रूप में क्रियान्वित किया, bash test.shलेकिन यह भी काम नहीं किया।
नेकेनेको

bashPOSIX मोड में उस सिंटैक्स का समर्थन नहीं करता है (जब --posixया जैसा कहा जाता है /bin/sh)। का उपयोग करें #!/bin/bash
जोर्डन

@NecNecco: क्या आपके पास वेरिएंट POSIXLY_CORRECTसेट है जब आप शुरू करते हैं bash?
cuonglm

@jordanm #!/bin/bashशीर्ष पर स्विच करने से समस्या ठीक हो गई।
नेकनेको

जवाबों:


23

प्रक्रिया प्रतिस्थापन POSIX द्वारा निर्दिष्ट नहीं है, इसलिए सभी POSIX खोल इसे समर्थन, की तरह ही कुछ गोले bash, zsh, ksh88, ksh93समर्थन करते हैं।

में Centosप्रणाली, /bin/shके लिए सिमलिंक है /bin/bash। जब bashनाम के साथ शुरू हो जाती है sh, bashमें प्रवेश करती है POSIX मोड ( बैश स्टार्टअप फ़ाइलें - नाम श के साथ आमंत्रण )। पॉज़िक्स मोड में, process substitutionसमर्थित नहीं है, सिंटैक्स त्रुटि का कारण बनता है।

स्क्रिप्ट को काम करना चाहिए, अगर आप bashसीधे कॉल करते हैं bash test.sh। यदि नहीं, तो शायद bashपॉज़िक्स मोड में प्रवेश किया है। यह तब हो सकता है जब आप तर्क के bashसाथ शुरू करते --posixहैं या चर शुरू POSIXLY_CORRECTहोने पर सेट किया जाता है bash:

$ bash --posix test.sh 
test.sh: line 54: syntax error near unexpected token `('
test.sh: line 54: `paste <(printf "%s\n" "TOP")'

$ POSIXLY_CORRECT=1 bash test.sh 
test.sh: line 54: syntax error near unexpected token `('
test.sh: line 54: `paste <(printf "%s\n" "TOP")

या विकल्प के bashसाथ बनाया गया --enable-strict-posix-defaultहै।

यहां, आपको प्रक्रिया प्रतिस्थापन की आवश्यकता नहीं है, आप मानक शेल पाइप का उपयोग कर सकते हैं:

printf "%s\n" "TOP" | paste -

-pasteस्टैडन से डेटा पढ़ने के लिए कहने का मानक तरीका है । कुछ pasteकार्यान्वयन के साथ , आप इसे छोड़ सकते हैं, हालांकि यह मानक नहीं है।

जहां यह उपयोगी होगा, जैसे एक से अधिक कमांड के आउटपुट को पेस्ट करते समय:

paste <(cmd1) <(cmd2)

समर्थन करने वाली प्रणालियों पर /dev/fd/n, इसके shसाथ किया जा सकता है :

{ cmd1 4<&- | { cmd2 3<&- | paste /dev/fd/3 -; } 3<&0 <&4 4<&-; } 4<&0

(यह <(...)आंतरिक रूप से क्या करता है)।


2

यहाँ एक और समाधान है। कमांड चलाने के बजाय, बैश चलाएं और कमांड को पास करके bash का उपयोग करें -c:

bash -c 'paste <(printf "%s\n" "TOP")'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.