Đó 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à while
không còn được coi là một từ khóa:
$ < foo while
bash: while: command not found
Do đó, điều do
nà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 while
cá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