将stdin转发给stdout

时间:2016-07-16 11:07:04

标签: bash stdout stdin stderr

我正在寻找一种方法将stdin“转发”到管道中的stdout,而在那一步中,某些东西被写入stderr。这个例子应该澄清一下:

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

这应该将"before.."添加到stdout,同时将"some logging..."添加到stderr。

怎么做?或者可能有另一种截然不同的方法吗?

2 个答案:

答案 0 :(得分:0)

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

echo "before" >&1
echo "some logging..." >&2
如果我明白你要做什么,

应该可以做到。

答案 1 :(得分:0)

以下是基于您的评论的解决方案:

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

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

tee复制其输入,写入stdout和列为参数的任何文件。

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

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

>&2将stdout重定向到stderr。

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

将所有内容放在一起,bash将

  • 运行cat ~/.bashrc,将~/.bashrc的内容放在stdout
  • ...用管道输送到tee
  • 的标准输出
  • 运行cat -n,stdout重定向到stderr,stdin重定向到新管道
  • 运行tee /dev/fd/63(其中/dev/fd/63代表cat -n管道的另一端)
  • 这就是它们汇集在一起​​的地方:tee读取它的输入并将其写入其stdout和另一个转到cat -n(从那里到stderr)的管道
  • 最后tee的标准输入进入sort