Bash

輸入重定向到 for 和 while

  • June 27, 2020

只是出於好奇,

此命令有效:

$ <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 循環)。

引用自:https://unix.stackexchange.com/questions/595000