双重重定向测试

Posted

技术标签:

【中文标题】双重重定向测试【英文标题】: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

【问题讨论】:

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

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

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

echo hello | cat < inputfile

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

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

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

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

【讨论】:

以上是关于双重重定向测试的主要内容,如果未能解决你的问题,请参考以下文章

使用多重重定向处理深度链接

如何在单个 html 链接中进行双重重定向?

IIS 将 www 重定向到非 www 和 http 到 https:是不是可以仅使用一个重定向来完成?

重定向时的 Apache vhost 双斜杠

关于shell输入 输出重定向

验收测试重定向到特定的 URL