以下代码段是否有效Bourne shell代码?

时间:2015-06-16 10:03:14

标签: bash syntax-error sh

以下代码段在由 bash 4.3.39(1)解释时会触发语法错误,但不会由 zsh 5.0.5解释。

eprintf()
{
    1>&2 {
        printf "$@"
        printf '\n'
    }
}

我刚刚在 bash 解析器中发现了一个错误?

2 个答案:

答案 0 :(得分:3)

这不是一个错误;从手册页:

  

以下重定向运算符可以在前面或出现          简单命令中的任何位置,或者可以跟随命令。

所以

outer-container

都是合法且等效的,但重定向必须遵循复合命令>/dev/null echo foo echo >/dev/null foo echo foo >/dev/null

因为{...}{bash使alias {=foo{的别名)没有特别的意义,所以foo行是解析为一个简单的命令,假设最终调用1>&2 {{的查找将成功。因此,第一个eprintf关闭作为函数体的复合语句,第二个是不匹配的,并触发语法错误。

我不能说没有进一步的研究为什么 }bash在这里有所不同,只是它是zsh的记录行为。

答案 1 :(得分:1)

根据Single Unix Specification,Shell和Utilities Volume,函数定义命令语法为:

fname() compound-command[io-redirect ...]

在你的情况下会给出:

eprintf() { printf "$@" ; printf '\n' } >&2

函数定义命令语法只允许一个复合命令,而且复合命令({ ... })没有语法中提到的任何io重定向,函数可以。

所以根据我对标准的解读,这看起来并不像一个错误。

相关问题