我正在寻找一种方法将stdin“转发”到管道中的stdout,而在那一步中,某些东西被写入stderr。这个例子应该澄清一下:
echo "before.." | >&2 echo "some logging..."; [[forward stdin>stdout]] | cat
这应该将"before.."
添加到stdout,同时将"some logging..."
添加到stderr。
怎么做?或者可能有另一种截然不同的方法吗?
答案 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