Bash - 如何区分控制运算符和元字符?

nn0*_*n0p 1 bash shell

根据bash 手册

control operator

执行控制功能的令牌。它是换行符或以下之一:“||”、“&&”、“&”、“;”、“;;”、“|”、“|&”、“(”或“)”。

metacharacter

不加引号时用于分隔单词的字符。元字符是空格或以下字符之一:“|”、“&”、“;”、“(”、“)”、“<”或“>”。

许多字符都是control operatormetacharacter

那么我怎么知道例如 a 的语法类别;呢?

if COND ; then CMD ; fi作为一个例子。

;control operator在上下文中似乎是 a ,因为它可以用newline代替。然而去除前置和后置空间s左右;仍然工作正常。如果它是一个运算符,它不应该被 sapces 分隔吗?

gri*_*ott 5

根据bash手册,anoperator是:

一个控制操作员重定向操作。有关重定向运算符的列表,请参阅重定向。运算符至少包含一个不带引号的元字符。

元字符基本上是任何不能属于 word.

的定义word

被外壳视为一个单元的字符序列。单词可能不包括未加引号的元字符。

周围不需要空格,operators因为它们总是包含metacharacters,这使解析器知道它不是word.

一个例外是redirection,例如

ls 2>&1
Run Code Online (Sandbox Code Playgroud)

重定向语句前需要一个空格,因为操作符有一个参数2,并且要求参数紧挨着操作符(否则它将是一个参数到ls)。