Bu sadece dilbilgisinin nasıl tanımlandığının bir sonucudur. Gönderen POSIX Kabuk Dilbilgisi şartname :
command : simple_command
| compound_command
| compound_command redirect_list
| function_definition
;
Ve:
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
;
Gördüğünüz gibi, bileşik komutlarla yeniden yönlendirmeye yalnızca sonradan izin verilir , ancak basit komutlarla daha önce de izin verilir. Bu nedenle, kabuk gördüğünde <redirection> foo
, foo
bileşik bir komut değil, basit bir komut olarak ele alınır ve while
artık bir anahtar kelime olarak ele alınmaz :
$ < foo while
bash: while: command not found
Bu nedenle, do
yalnızca belirli anahtar kelimelerden sonra izin verildiğinden, beklenmedik bir durumdur.
Bu sadece while
döngüler için değil , ayrılmış sözcükler kullanarak bileşik komutlar oluşturmanın çoğu yolu için geçerlidir :
$ < foo {
bash: {: command not found
$ < foo if
bash: if: command not found
$ < foo for
bash: for: command not found