क्या कोई ऐसा sh कोड है जो syntactically मान्य बैश कोड नहीं है?


31

क्या कोई ऐसा shकोड है जो वाक्यविन्यास रूप से मान्य बैश कोड नहीं है (सिंटैक्स पर बारफ नहीं होगा)?

मैं कुछ आदेशों के shसाथ ओवरराइटिंग के बारे में सोच रहा हूं bash


1
मुझे लगता है कि मैं वैध रूप से वैध रूप से मान्य है, इसलिए यह वाक्यविन्यास पर रोक नहीं लगाएगा
अलेक्जेंडर मिल्स

2
अलग-अलग टोकन? जैसे ((मन में आता है।
ccorn

1
कुछ डिस्ट्रोस के /usr/bin/shलिए सिर्फ एक सिम-लिंक है /usr/bin/bash(मैं CentOS 7.3 का उपयोग कर रहा हूं और यह है)। आपको यह देखने के लिए जांचना चाहिए कि shक्या वास्तव bashमें आपके डिस्ट्रो के लिए है।
शताब्दी

1
कुछ साल पहले, मेरा पूरा प्रोजेक्ट तब टूट गया जब कुछ को "अपग्रेड" किया गया। मैं से मेरे सारे कुटिया लाइनों बदलना पड़ा #!/bin/shकरने के लिए #!/bin/bash। फिर सब कुछ फिर से काम किया, इसलिए आपको वास्तव में सावधान रहना होगा। ऐसा तब हो सकता है जब उन्होंने श के लिए बैश के बजाय डैश का इस्तेमाल करना शुरू कर दिया।
जो

1
@ जो, ओपी जो पूछ रहा है, उसके विपरीत है - आपके पास bash कोड था जिसे sh कोड के रूप में भ्रमित किया गया था, लेकिन नहीं था। ओपी पूछ रहा है कि क्या वे हो सकते हैं (वास्तविक, गुमराह नहीं) कोड जो बश के साथ चलने पर टूट जाता है, न कि अगर उनके पास बैश कोड हो सकता है जो बंटने पर बिखरता है (जो स्पष्ट है - यदि बैश एक्सटेंशन नहीं किया गया तो उपलब्ध भाषा सुविधाओं पर कोई प्रभाव पड़ता है, वे एक्सटेंशन नहीं होंगे)।
चार्ल्स डफी

जवाबों:


49

यहाँ कुछ कोड है जो POSIX sh और Bash में कुछ अलग करता है :

hello &> world

क्या आपके लिए "अमान्य" है, मुझे नहीं पता।

बैश में, यह मानक आउटपुट और मानक त्रुटि दोनोंhello को फ़ाइल से पुनर्निर्देशित करता है world। POSIX में sh, यह helloबैकग्राउंड में चलता है और फिर एक खाली रिडायरेक्शन बनाता है world, इसे ट्रंकुकेट करता है (यानी इसे जैसा माना जाता है & >)।

ऐसे बहुत से अन्य मामले हैं जहां बैश एक्सटेंशन के तहत चलने पर अपनी बात bashकरेंगे, और शुद्ध POSIX में अलग-अलग प्रभाव होंगे sh। उदाहरण के लिए, ब्रेस विस्तार एक और है, और यह बैश के पोसिक्स मोड के तहत भी संचालित होता है और नहीं भी।


जहाँ तक स्थिर वाक्यविन्यास त्रुटियां हैं, बैश में POSIX द्वारा निर्दिष्ट (जैसे [[और दोनों time) शब्द नहीं हैं, जैसे कि [[ xमान्य POSIX शेल कोड लेकिन एक बैश सिंटैक्स त्रुटि, और विभिन्न POSIX असंगतता के इतिहास का एक वाक्य जो सिंटैक्स त्रुटियों में परिणाम कर सकता है, इस सवाल से एक जैसे :

x=$(cat <<'EOF'
`
EOF
)
bash: line 2: unexpected EOF while looking for matching ``'
bash: line 5: syntax error: unexpected end of file

सिंटेक्स-त्रुटियां-केवल किसी भी परिस्थिति के लिए "अमान्य" की एक बहुत खतरनाक परिभाषा है जहां यह मायने रखता है, लेकिन यह है।


3
ध्यान दें कि ब्रेस विस्तार वर्तमान में बैश (और zsh, pdksh, ksh93) गैर-अनुपालन करता है, POSIX ब्रेस विस्तार (और {fd}>fileएक समान मुद्दा) की अनुमति देने के लिए विनिर्देश में प्रावधान जोड़ने पर काम कर रहा है , ताकि बैश फिर से कंफर्टेबल हो सके (ब्रेस विस्तार अनिर्दिष्ट रहेगा, लेकिन आज्ञाकारी लिपियों को ऐसा करने की आवश्यकता होगी echo "{a,b}"कि वे {a,b}आउटपुट बनना चाहते हैं )। देखिए चर्चा जो शुरू हुई
स्टीफन Chazelas

2
इस प्रश्नोत्तर के लिए भी प्रासंगिक: austingroupbugs.net/view.php?id=1191#c3983
स्टीफन चेज़लस

2
क्या POSIX sh में स्क्रिप्ट लिखने वाला व्यक्ति कभी इस तरह से कमांड लिखेगा? ओपी को कोसने से जा रहा है, और मेरी समझ से ऐसा लगता है कि यह दूसरी दिशा में जाने में एक समस्या होगी?
रिच

1
@ रीच: ज़रूर। मैं किसी भी सिस्टम का उपयोग नहीं करता जहाँ /bin/shbash है, इसलिए यदि मुझे इस bashism के बारे में सक्रिय रूप से जानकारी नहीं है, तो कमांड लाइन लिखना यह आसानी से हो सकता है। जवाब में अंतर होने की संभावना नहीं दिखती है, लेकिन hello&>worldयह बहुत कम है।
आर ..

2
मैंने वास्तव में पिछले महीने अंतर के कारण&> एक बग देखा था!
गॉर्डन डेविसन

16

एक छोटा उदाहरण:

time()(:)

timeबैश में एक आरक्षित शब्द है, और timeकार्यक्रम से अलग व्यवहार करता है । यह काफी संभावना है कि आप timeबैश का उपयोग करके कुछ व्यावहारिक स्क्रिप्ट को तोड़ने की कोशिश करेंगे । लेकिन तकनीकी रूप से यह एक सिंटैक्स त्रुटि नहीं है। timeएक फ़ंक्शन के रूप में पुनर्परिभाषित करना दुर्लभ होगा, लेकिन एक सिंटैक्स त्रुटि का कारण बनता है क्योंकि यह प्रश्न निर्दिष्ट करता है।

एक छोटा उदाहरण:

a():

में मान्य है dash, लेकिन POSIX अनुरूप नहीं है।


3
अधिक आम तौर पर, कोई भी शब्द जो एक अमानवीय कीवर्ड या बैश में एक अंतर्निहित कमांड है, वही प्रभाव पैदा करेगा। के अलावा time, वहाँ सामान की तरह declare, function, select, और coproc। हालांकि उनमें से कुछ को स्पष्ट रूप से मानक ( कीवर्ड और बिल्ड / यूटिलिटीज ) में अनिर्दिष्ट के रूप में चिह्नित किया गया है , लेकिन मैं उदाहरण के लिए timeया coprocसूची में नहीं देख सकता । और उपयोग --posixकरने से मदद नहीं लगती है।
इल्काचू ११'१ach
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.