【问题标题】:Explain this bash redirection behaviour解释这个 bash 重定向行为
【发布时间】:2018-08-21 03:38:08
【问题描述】:

我正在尝试重定向和管道,但不了解某些行为。我有这个 sn-p 在 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)

为什么最后一个命令将两个流结合起来?还是发生了什么让我的大脑崩溃了?

【问题讨论】:

    标签: linux bash pipe io-redirection


    【解决方案1】:

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

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

    【讨论】:

    • 根据图表,我不应该看到输出1 AND 2 吗?底部 wc 计算“stderr”。前一个计数'stdout\n1'。
    • @EvanBenn 1 被第一个 wc -l 消费,所以你只能看到 2
    • 感谢您的回答,跟进:有没有办法做我认为会发生的事情?即消除图表中的向上箭头
    猜你喜欢
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2012-09-07
    • 2012-11-11
    • 2014-12-17
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多