Bash
輸入重定向到 for 和 while
只是出於好奇,
此命令有效:
$ <file cat
但這些都沒有:
$ <file for bash: for: command not found... $ <file while bash: while: command not found...
這是為什麼?
POSIX 語法就是這樣寫的。命令定義為:
command : simple_command | compound_command | compound_command redirect_list | function_definition
一個簡單的命令在哪裡
simple_command : cmd_prefix cmd_word cmd_suffix [...]
並
cmd_prefix
最終cmd_suffix
允許重定向。對於復合命令,只有redirect_list
末尾允許它們,前面沒有任何允許。它並不一定是這樣的,例如 Zsh 接受這個就好了:
% > output for x in a b c ; do echo $x; done % cat output a b c
但這是 Zsh 不兼容的,因為在標準 shell 中,前導重定向強制
for
命令被解析為正常簡單命令,這意味著以下內容是有效的,shell 將嘗試查找並執行字面上稱為的命令for
(帶有五個參數,並且標準輸出重定向)。給出您看到的錯誤:$ > output for x in a b c bash: for: command not found
(特別是在 Bash 中,首先解析整個輸入行,因此如果您將
for-do-done
第一個範例中的全部內容放在一行中,它只會刪除 的語法錯誤do
,並且不會在此for
之前執行。)如果我不得不猜測,我希望定義的根本原因是它總是這樣工作,所以標準已經這樣編纂了它。
儘管請注意,已經討論過在這方面更改標準。(可能沒有一個頭腦正常的人實際上依賴於
> output for ...
一個命令for
而不是 shell 循環)。