【问题标题】:Double redirection test双重重定向测试
【发布时间】:2011-06-05 07:34:53
【问题描述】:

这会打印你的 shell 什么?

echo foo | while read line; do echo $line; done < <(echo bar)

我希望它评估为 echo foo | barfoo &lt; &lt;(bar),这两者都会导致错误消息。

在 Bash 4.1.5 中,管道似乎被简单地丢弃了:

bar

在短跑中:

sh: Syntax error: redirection unexpected

【问题讨论】:

  • 为什么重要?这是糟糕的设计,您不应多次重定向标准输入。
  • 这更像是一种心理锻炼——我刚刚意识到它是有效的语法,它应该用它做一些“合理”的事情。

标签: bash shell redirect dash-shell


【解决方案1】:

Dash 不支持进程替换 (&lt;())。

如果您使用所比较的每个 shell 所支持的语法,您所看到的行为是一致的。试试这个:

echo hello | cat < inputfile

您应该看到“inputfile”的内容,而不是“hello”。在我试过的几个 shell 中,只有 Z shell 两个都显示了。

这是 POSIX 关于管道和重定向的说法:

command1 的标准输出应连接到command2 的标准输入。在作为命令的一部分的重定向运算符指定的任何重定向之前,应将命令的标准输入、标准输出或两者都视为由管道分配(请参阅重定向)。

我将这解释为在上面的示例中,管道将标准输入分配给cat,然后重定向会覆盖它。

【讨论】:

    猜你喜欢
    • 2013-12-29
    • 2013-02-13
    • 2015-02-04
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多