आप लूप के लिए इनपुट पुनर्निर्देशन ऑपरेटर के आदेश को उल्टा क्यों नहीं कर सकते?


11

बैश में आप इनपुट पुनर्निर्देशन ऑपरेटरों को एक कमांड के सामने ले जा सकते हैं:

cat <<< "hello"
# equivalent to
<<< "hello" cat

आप छोरों के लिए ऐसा करने में असमर्थ क्यों हैं?

while read -r line; do echo "$line"; done <<< "hello"
# hello

<<< "hello" while read -r line; do echo "$line"; done
# -bash: syntax error near unexpected token `do'

मुझे यह थोड़ा उलझा हुआ लगता है क्योंकि आप थोड़ी देर के लूप में पाइप लगा सकते हैं । क्या मैं कुछ गलत कर रहा हूं या यह केवल एक डिजाइन निर्णय था?

जवाबों:


16

यह सिर्फ एक परिणाम है कि व्याकरण को कैसे परिभाषित किया जाता है। से POSIX शैल व्याकरण विनिर्देश :

command          : simple_command
                 | compound_command
                 | compound_command redirect_list
                 | function_definition
                 ;

तथा:

simple_command   : cmd_prefix cmd_word cmd_suffix
                 | cmd_prefix cmd_word
                 | cmd_prefix
                 | cmd_name cmd_suffix
                 | cmd_name
                 ;
[...]
cmd_prefix       :            io_redirect
                 | cmd_prefix io_redirect
                 |            ASSIGNMENT_WORD
                 | cmd_prefix ASSIGNMENT_WORD
                 ;
cmd_suffix       :            io_redirect
                 | cmd_suffix io_redirect
                 |            WORD
                 | cmd_suffix WORD
                 ;

जैसा कि आप देख सकते हैं, यौगिक आदेशों के साथ, पुनर्निर्देशन के बाद ही अनुमति दी जाती है , लेकिन सरल आदेशों के साथ, पहले भी अनुमति दी जाती है। इसलिए, जब शेल देखता है <redirection> foo, तो fooइसे एक साधारण कमांड के रूप में माना जाता है, यौगिक कमांड के whileरूप में नहीं , और अब इसे कीवर्ड के रूप में नहीं माना जाता है:

$ < foo while
bash: while: command not found

इसलिए, doयह अप्रत्याशित है, क्योंकि इसे केवल कुछ कीवर्ड के बाद अनुमति दी जाती है।

तो यह न केवल whileलूप पर लागू होता है , बल्कि आरक्षित शब्दों का उपयोग करके यौगिक कमांड स्थापित करने के अधिकांश तरीके हैं:

$ < foo {
bash: {: command not found
$ < foo if
bash: if: command not found
$ < foo for
bash: for: command not found

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