มันเป็นเพียงผลสืบเนื่องจากการกำหนดไวยกรณ์ จากข้อมูลจำเพาะไวยากรณ์ของ POSIX Shell :
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