来自C ++:对我来说,一些空白对脚本的有效性或语义有影响似乎总是神奇的。这是一个例子:
echo a 2 > &1
bash:意外令牌附近的语法错误`&'
echo a 2 >&1
a 2
echo a 2>&1
一
echo a 2>& 1
一
看this并没什么帮助。我的主要问题是感觉不一致;而且我处于混乱状态。
我正在试图找出bash如何标记其脚本。可以理解为澄清任何混淆的一般描述。
编辑: 我不是专门寻找重定向。他们只是举例说明。其他例子:
A="something"
A = "something"
if [$x = $y];
if [ $x = $y ];
为什么在和之间没有必要的空间;?为什么作业需要立即等号? ...
答案 0 :(得分:3)
2>&1
是一个操作符令牌,因此任何破坏它的空格都会改变命令的含义。它恰好是一个参数化标记,这意味着shell将进一步标记它以确定操作符的确切含义。一般形式为n>&m
,其中n
是您要重定向的文件描述符,m
是您要复制到的描述符。在这种情况下,您说应该将命令的标准错误(2)复制到当前打开的任何标准输出(1)。
答案 1 :(得分:2)
您提供的示例有充分理由表达了他们的行为。
>&1
本身就是合法语法 - 它将FD 1重定向到FD 1 - 意味着在>
之前允许空格会导致语法模糊:解析器无法判断前面的标记是否是它自己的单词或重定向源。>&
之外,FD号码以外的任何内容都无效,除非您处于一个非常新的bash中,该bash允许取消引用变量以检索FD号码。在任何情况下,紧随>&
之后的任何事物都被认为是文件描述符,因此允许可选的空格在那里不会产生歧义。a = 1
被解析为合法命令,而不是语法错误:它使用第一个参数a
和第二个参数=
运行命令1
。禁止分配中的空白消除了这种模糊性。类似地,a= foo
具有单独且不同的含义:它在运行命令a
时导出具有空值的环境变量foo
。放宽空白规则将不允许这两个合法的命令。[
是一个命令,而不是解析器已知的特殊语法;因此,[foo
试图找到一个命令(名为/usr/bin/[foo
),需要空格。;
在解析器中优先作为语句分隔符,而不是被视为单词的一部分,除非引用或转义。 &
(另一个分隔符)或换行符也是如此。[[ ]]
,但它们总体上足够小,可以学习它们。
其他建议资源: