在管道中间控制终端

在管道中间控制终端

假设我有 3 个通过管道链接的命令:

A | B | C

我希望 B 将错误消息输出到 stderr 并将一些进度输出到终端。如果 stderr 与终端相同,那就很简单:只需将进度信息发送到 stderr 即可。但是如果 stderr 被重定向怎么办?

A | B 2>/tmp/file | C

然后我仍然希望将进度信息发送到终端,而将错误消息发送到文件。

我现在可以以某种方式识别 stderr 如果没有被重定向的话最终会到达的终端吗?

我最初的想法是找到 tty 使用tty然后打开它并写入它。但是,如果我tty从 B 内部调用tty说:not a tty,我相信这是因为 A 和 B 之间的管道所致。

我想用 Perl 来做这件事。

答案1

Linux 具体:

echo |perl -e '$p=getppid; `echo foo > /proc/$p/fd/2`'

如果您在这里重定向 stderr 'foo' 仍然打印在终端上:

echo |perl -e '$p=getppid; `echo foo > /proc/$p/fd/2`' 2>/dev/null

相关内容