双重重定向测试
Posted
技术标签:
【中文标题】双重重定向测试【英文标题】:Double redirection test 【发布时间】:2011-06-05 07:34:53 【问题描述】:这会打印你的 shell 什么?
echo foo | while read line; do echo $line; done < <(echo bar)
我希望它评估为 echo foo | bar
或 foo < <(bar)
,这两者都会导致错误消息。
在 Bash 4.1.5 中,管道似乎被简单地丢弃了:
bar
在短跑中:
sh: Syntax error: redirection unexpected
【问题讨论】:
为什么重要?这是糟糕的设计,您不应多次重定向标准输入。 这更像是一种心理锻炼——我刚刚意识到它是有效的语法,它应该用它做一些“合理”的事情。 【参考方案1】:Dash 不支持进程替换 (<()
)。
如果您使用所比较的每个 shell 所支持的语法,您所看到的行为是一致的。试试这个:
echo hello | cat < inputfile
您应该看到“inputfile”的内容,而不是“hello”。在我试过的几个 shell 中,只有 Z shell 两个都显示了。
这是 POSIX 关于管道和重定向的说法:
command1 的标准输出应连接到command2 的标准输入。在作为命令的一部分的重定向运算符指定的任何重定向之前,应将命令的标准输入、标准输出或两者都视为由管道分配(请参阅重定向)。
我将这解释为在上面的示例中,管道将标准输入分配给cat
,然后重定向会覆盖它。
【讨论】:
以上是关于双重重定向测试的主要内容,如果未能解决你的问题,请参考以下文章