linux - 解释这个 bash 重定向行为

标签 linux bash pipe io-redirection

我正在尝试重定向和管道,但不理解某些行为。我有这段代码可以在 stderr 和 stdout 上分别生成一行:

(echo stdout; echo stderr 1>&2)

似乎 可以正常工作,(尝试 >/devnull 和 2>/dev/null)。

但这三个命令的行为让我感到困惑:

(echo stdout; echo stderr 1>&2) > >(wc -l)
stderr
1
(echo stdout; echo stderr 1>&2) 2> >(wc -l)
stdout
1
(echo stdout; echo stderr 1>&2) > >(wc -l) 2> >(wc -l)
2
(empty)

为什么最后一个命令会合并两个流?或者还有什么事情让我的大脑崩溃了?

最佳答案

因为第二个 wc -l 从当前命令派生 stdout(stdout 已经重定向到第一个 wc -l),它的输出也是传递给第一个 wc -l

 IN   +-----------+   1>    +---------+         OUT
+-+--->echo stdout+----+---->  wc -l  +------------->
  |   +-----------+    ^    +---------+
  |                    |
  |                    |
  |                    +<------------------+
  |                                        |
  |                                        |
  |   +-----------+   2>    +---------+    |
  +--->echo stderr+--------->  wc -l  +----+
      +-----------+         +---------+

关于linux - 解释这个 bash 重定向行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51941229/

相关文章:

php - VIM 在打开 PHP 文件时捕获致命信号 SEGV

java - Java Media Framework 安装失败

linux - 为什么在shell脚本中使用ls重定向只写入一个文件名

linux - 如何在 Unix 中使用 If 语句检查目录中的多个文件

python - 在 IronPython 中重现 PIPE 功能

bash - 进程替换被管道破坏

linux - 为什么STRACE显示EAGAIN(资源暂时不可用)

Java内存之谜(我有泄漏)?

linux - 基于 Bash 中的行内容加速大文本文件的分离

c# - 如何在网络上使用命名管道?