Jest to tylko konsekwencja definicji gramatyki. Ze specyfikacji gramatyki powłoki POSIX :
command : simple_command
| compound_command
| compound_command redirect_list
| function_definition
;
I:
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
;
Jak widać, w przypadku poleceń złożonych przekierowanie jest dozwolone tylko po , ale w przypadku prostych poleceń jest również dozwolone wcześniej. Tak więc, gdy powłoka widzi <redirection> foo
, foo
jest traktowane jako proste polecenie, a nie złożone, i while
nie jest już traktowane jako słowo kluczowe:
$ < foo while
bash: while: command not found
Dlatego do
jest to nieoczekiwane, ponieważ jest dozwolone tylko po określonych słowach kluczowych.
Dotyczy to nie tylko while
pętli, ale większości sposobów konfigurowania złożonych poleceń przy użyciu słów zastrzeżonych:
$ < foo {
bash: {: command not found
$ < foo if
bash: if: command not found
$ < foo for
bash: for: command not found