将标准输入转发到标准输出

forward stdin to stdout

我正在寻找一种方法 "forward" stdin 到管道中的 stdout,同时在该步骤中将某些内容写入 stderr。该示例应阐明这一点:

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

这应该将 "before.." 输出到标准输出,同时将 "some logging..." 输出到标准错误。

怎么做?或者是否有另一种完全不同的方法?

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

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

应该可以解决问题,如果我理解您的意图。

根据您的意见,这是一个解决方案:

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

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

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

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

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

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

sort代表你的流水线结束(正常处理未改变的输入)。


将它们放在一起,bash 将

  • 运行cat ~/.bashrc,将~/.bashrc的内容输出到标准输出
  • ... 通过管道传输到 tee
  • 的标准输入
  • 运行 cat -n 标准输出重定向到标准错误,标准输入重定向到新管道
  • 运行 tee /dev/fd/63(其中/dev/fd/63表示cat -n管道的另一端)
  • 这就是一切汇集的地方:tee 读取其输入并将其写入其标准输出和另一个通往 cat -n(并从那里到 stderr)的管道
  • 最后 tee 的标准输出进入 sort