Bash Tokenize脚本如何?

时间:2015-07-06 18:08:16

标签: bash tokenize

来自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 ]; 

为什么在和之间没有必要的空间;?为什么作业需要立即等号? ...

2 个答案:

答案 0 :(得分:3)

2>&1是一个操作符令牌,因此任何破坏它的空格都会改变命令的含义。它恰好是一个参数化标记,这意味着shell将进一步标记它以确定操作符的确切含义。一般形式为n>&m,其中n是您要重定向的文件描述符,m是您要复制到的描述符。在这种情况下,您说应该将命令的标准错误(2)复制到当前打开的任何标准输出(1)。

答案 1 :(得分:2)

您提供的示例有充分理由表达了他们的行为。

  • 重定向源默认为FD 1.因此,>&1本身就是合法语法 - 它将FD 1重定向到FD 1 - 意味着在>之前允许空格会导致语法模糊:解析器无法判断前面的标记是否是它自己的单词或重定向源。
  • 除了>&之外,FD号码以外的任何内容都无效,除非您处于一个非常新的bash中,该bash允许取消引用变量以检索FD号码。在任何情况下,紧随>&之后的任何事物都被认为是文件描述符,因此允许可选的空格在那里不会产生歧义。
  • a = 1被解析为合法命令,而不是语法错误:它使用第一个参数a和第二个参数=运行命令1。禁止分配中的空白消除了这种模糊性。类似地,a= foo具有单独且不同的含义:它在运行命令a时导出具有空值的环境变量foo。放宽空白规则将不允许这两个合法的命令。
  • [是一个命令,而不是解析器已知的特殊语法;因此,[foo试图找到一个命令(名为/usr/bin/[foo),需要空格。
  • ;在解析器中优先作为语句分隔符,而不是被视为单词的一部分,除非引用或转义。 &(另一个分隔符)或换行符也是如此。
事实是,没有任何单一的一般规则可以解释这一切;你需要read and learn the language syntax。幸运的是,没有非常语法:几乎所有命令都是“简单命令”,遵循非常简单明了的规则。你问的是,我们正在解释一些例外;还有其他例外,例如bash中的[[ ]],但它们总体上足够小,可以学习它们。

其他建议资源: