题
这打印出什么外壳?
echo foo | while read line; do echo $line; done < <(echo bar)
我希望它能评估 echo foo | bar
或者 foo < <(bar)
, ,这两者都会导致错误消息。
在Bash 4.1.5中,看起来管道被简单地丢弃:
bar
在Dash中:
sh: Syntax error: redirection unexpected
解决方案
破折号不支持流程替代(<()
).
如果您使用要比较的每个外壳支持的语法,则您看到的行为是一致的。试试这个:
echo hello | cat < inputfile
您应该看到“ inputfile”的内容,而不是“你好”。在我尝试过的几个贝壳中,只有z壳两者都显示。
这就是Posix关于管道和重定向的说法:
命令1的标准输出应连接到命令2的标准输入。标准输入,标准输出或两个命令的两个命令应由管道分配给命令一部分的重定向操作员指定的任何重定向(请参阅重定向)。
我将其解释为意味着在上面的示例中,管道将stdin分配给 cat
然后重定向覆盖它。
不隶属于 StackOverflow