Itu hanya konsekuensi dari bagaimana tata bahasa didefinisikan. Dari spesifikasi Tata Bahasa POSIX Shell :
command : simple_command
| compound_command
| compound_command redirect_list
| function_definition
;
Dan:
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
;
Seperti yang Anda lihat, dengan perintah majemuk, pengalihan hanya diperbolehkan setelahnya , tetapi dengan perintah sederhana, itu juga diizinkan sebelumnya. Jadi, ketika shell melihat <redirection> foo
, foo
diperlakukan sebagai perintah sederhana, bukan perintah majemuk, dan while
tidak lagi diperlakukan sebagai kata kunci:
$ < foo while
bash: while: command not found
Karenanya, do
ini tidak terduga, karena hanya diperbolehkan setelah kata kunci tertentu.
Jadi ini berlaku tidak hanya untuk while
loop, tetapi sebagian besar cara mengatur perintah majemuk menggunakan kata-kata yang dipesan:
$ < foo {
bash: {: command not found
$ < foo if
bash: if: command not found
$ < foo for
bash: for: command not found