假设我有 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