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


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.