यह सिर्फ एक परिणाम है कि व्याकरण को कैसे परिभाषित किया जाता है। से 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