如何使用管道将stderr连接到stdin?

时间:2011-09-15 13:31:59

标签: bash pipe

“|”管道运算符将一个进程的 stdout 连接到另一个进程的stdin。有没有办法创建一个管道,将一个进程的 stderr 连接到另一个进程的stdin,使stdout在我的终端中保持活动状态?在网上搜索没有给我任何信息......

提前谢谢你, 米哈利斯。

4 个答案:

答案 0 :(得分:2)

如果你很高兴混合 stdouot和stderr,那么你可以先将stderr重定向到stdout,然后管道:

theprogram 2>&1 | otherprogram

如果您不想要stdout,可以杀死那个:

theprogram 2>&1 1> /dev/null | otherprogram

如果您确实想要存储原始标准输出,则必须将其重定向到文件(代替/dev/null),或者重定向到之前使用{{1}打开的另一个文件描述符}。 Here are some details.

(不幸的是,没有直接的“管道这个文件描述符”语法,如exec。这本来很方便。)

答案 1 :(得分:2)

您也可以更换标准品和标准品。斯特德尔溪流,我即stdout成为新的stderr,stderr成为新的stdout)。

# only the stdout stream gets upcased
ls -ld / xxx ~/.bashrc yyy 3>&1 1>&2 2>&3 3>&- | tr '[[:lower:]]' '[[:upper:]]'

# block original stdout by closing fd 1
ls -ld / xxx ~/.bashrc yyy 2>&1 1>&- | tr '[[:lower:]]' '[[:upper:]]'

答案 2 :(得分:2)

您可以使用命名管道:

mkfifo /my/pipe
error-handler </my/pipe &
do-something 2>/my/pipe

这应该保持stdin&amp;终端中的“do-something”stdout并将stderr重定向到/ my / pipe,由“error-handler”读取。

(我希望这项工作,无需进行测试)

答案 3 :(得分:2)

您可以使用bash的进程替换功能获得此效果:

somecommand 2> >(errorprocessor)