ব্যাকরণ কীভাবে সংজ্ঞায়িত করা হয়েছে তার এটি কেবল একটি পরিণতি। থেকে 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
অপ্রত্যাশিত, কারণ এটি কেবলমাত্র নির্দিষ্ট কীওয়ার্ডের পরে অনুমোদিত allowed
সুতরাং এটি কেবল while
লুপগুলিতেই लागू হয় না, তবে সংরক্ষিত শব্দ ব্যবহার করে যৌগিক কমান্ড স্থাপনের বেশিরভাগ উপায়:
$ < foo {
bash: {: command not found
$ < foo if
bash: if: command not found
$ < foo for
bash: for: command not found