这只是语法定义方式的结果。根据POSIX Shell语法规范:
command : simple_command
| compound_command
| compound_command redirect_list
| function_definition
;
和:
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
;
如您所见,对于复合命令,仅在之后允许重定向,而对于简单命令,也允许在之前重定向。因此,当shell看到时<redirection> foo
,foo
被视为简单命令,而不是复合命令,并且while
不再被视为关键字:
$ < foo while
bash: while: command not found
因此,这do
是意外的,因为仅在某些关键字之后才允许使用。
因此,这不仅适用于while
循环,而且适用于使用保留字设置复合命令的大多数方式:
$ < foo {
bash: {: command not found
$ < foo if
bash: if: command not found
$ < foo for
bash: for: command not found