Đó chỉ là hệ quả của cách xác định ngữ pháp. Từ đặc tả ngữ pháp POSIX Shell :
command : simple_command
| compound_command
| compound_command redirect_list
| function_definition
;
Và:
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
;
Như bạn có thể thấy, với các lệnh ghép, chuyển hướng chỉ được phép sau , nhưng với các lệnh đơn giản, nó cũng được cho phép trước. Vì vậy, khi shell nhìn thấy <redirection> foo, foođược coi là một lệnh đơn giản, không phải là lệnh ghép và whilekhông còn được coi là một từ khóa:
$ < foo while
bash: while: command not found
Do đó, điều donày là bất ngờ, vì nó chỉ được phép sau một số từ khóa nhất định.
Vì vậy, điều này không chỉ áp dụng cho whilecác vòng lặp, mà hầu hết các cách thiết lập lệnh ghép sử dụng các từ dành riêng:
$ < foo {
bash: {: command not found
$ < foo if
bash: if: command not found
$ < foo for
bash: for: command not found