È solo una conseguenza di come viene definita la grammatica. Dalla specifica POSIX Shell Grammar :
command : simple_command
| compound_command
| compound_command redirect_list
| function_definition
;
E:
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
;
Come puoi vedere, con i comandi composti, il reindirizzamento è consentito solo dopo , ma con comandi semplici, è consentito anche prima. Quindi, quando la shell vede <redirection> foo
, foo
viene trattata come un semplice comando, non come un comando composto, e while
non viene più trattata come una parola chiave:
$ < foo while
bash: while: command not found
Quindi, do
è imprevisto, poiché è consentito solo dopo determinate parole chiave.
Quindi questo vale non solo per i while
loop, ma la maggior parte dei modi di impostare comandi composti usando parole riservate:
$ < foo {
bash: {: command not found
$ < foo if
bash: if: command not found
$ < foo for
bash: for: command not found