以下代码段在由 bash 4.3.39(1)解释时会触发语法错误,但不会由 zsh 5.0.5解释。
eprintf()
{
1>&2 {
printf "$@"
printf '\n'
}
}
我刚刚在 bash 解析器中发现了一个错误?
答案 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重定向,函数可以。
所以根据我对标准的解读,这看起来并不像一个错误。