双重定向测试

发布于 2024-10-11 04:54:31 字数 344 浏览 5 评论 0原文

这会打印你的外壳什么?

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

What does this print your shell?

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

I would expect it to evaluate to echo foo | bar or foo < <(bar), both of which would result in an error message.

In Bash 4.1.5 it looks like the pipe is simply discarded:

bar

In Dash:

sh: Syntax error: redirection unexpected

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

孤檠 2024-10-18 04:54:31

Dash 不支持进程替换 (<())。

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

echo hello | cat < inputfile

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

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

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

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

Dash doesn't support process substitution (<()).

The behavior you're seeing is consistent if you use syntax that's supported by each of the shells you're comparing. Try this:

echo hello | cat < inputfile

You should see the contents of "inputfile" and not "hello". Of several shells I tried, only Z shell showed both.

This is what POSIX says regarding pipelines and redirection:

The standard output of command1 shall be connected to the standard input of command2. The standard input, standard output, or both of a command shall be considered to be assigned by the pipeline before any redirection specified by redirection operators that are part of the command (see Redirection ).

I interpret this to mean that in the case of the example above, the pipeline assigns stdin to cat then the redirection overrides it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文