【问题标题】:forward stdin to stdout将标准输入转发到标准输出
【发布时间】:2016-07-16 11:07:04
【问题描述】:

我正在寻找一种将标准输入“转发”到管道中的标准输出的方法,同时在该步骤中将某些内容写入标准错误。该示例应阐明这一点:

echo "before.." | >&2 echo "some logging..."; [[forward stdin>stdout]] | cat

这应该把"before.." 放到stdout,同时"some logging..." 放到stderr。

如何做到这一点?或者是否有另一种完全不同的方法?

【问题讨论】:

  • 您介意重新表述这个问题以使其有意义吗?
  • echo "before..." | { >&2 echo "some logging..."; cat; } 不会做你想做的事吗? (这可能对您的示例过于具体,因为 echo 不会从标准输入中读取。)
  • 你能不能提供一个参考 {} 做什么?

标签: bash stdout stdin stderr


【解决方案1】:

这是基于您的 cmets 的解决方案:

cat ~/.bashrc | tee >( cat -n >&2 ) | sort

cat ~/.bashrc 代表管道的开始,产生一些数据。

tee 复制其输入,同时写入标准输出和作为参数列出的任何文件。

>( ... ) 是一个 bash 构造,它将 ... 作为管道子命令运行,但用文件名替换自身(tee 可以打开和写入的文件名)。

cat -n代表修改输入(添加行号)。

>&2 将标准输出重定向到标准错误。

sort 表示您的管道结束(正常处理未更改的输入)。


综上所述,bash 会

  • 运行cat ~/.bashrc,将~/.bashrc的内容放到标准输出上
  • ... 通过管道传送到tee 的标准输入
  • 运行cat -n,将标准输出重定向到标准错误,标准输入重定向到新管道
  • 运行tee /dev/fd/63(其中/dev/fd/63代表cat -n管道的另一端)
  • 这就是所有内容的结合点:tee 读取其输入并将其写入其 stdout 和另一个通往 cat -n 的管道(并从那里到 stderr)
  • 终于tee的标准输出进入sort

【讨论】:

  • 完美,这正是我所需要的。
【解决方案2】:

重定向遵循它们引用的简单命令,因此

echo "before" >&1
echo "some logging..." >&2

如果我理解你想要做什么,应该可以解决问题。

【讨论】:

  • >&1 是无操作的。
  • @TheHobbit。好的,我试着做更好的例子。比如说,你想通过几个管道步骤来处理一些数据。一个 |乙 | c | ...在某一时刻,您想要记录数据的修改版本,例如添加了一些行号。但同时您希望通过进一步的管道步骤继续处理未更改的数据... d |电子| f.
  • @AntonHarald 将您问题的详细信息放在问题中,而不是对答案发表评论。
  • 因此,基本上,你需要像 tee 这样的东西,能够复制它的标准输入像 echo "foo" |三通 /dev/stderr
猜你喜欢
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2014-02-02
  • 1970-01-01
相关资源
最近更新 更多