“|”管道运算符将一个进程的 stdout 连接到另一个进程的stdin。有没有办法创建一个管道,将一个进程的 stderr 连接到另一个进程的stdin,使stdout在我的终端中保持活动状态?在网上搜索没有给我任何信息......
提前谢谢你, 米哈利斯。
答案 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)