如何将相同的消息重定向到 stdoud 和 stderr (没有临时对象)

如何将相同的消息重定向到 stdoud 和 stderr (没有临时对象)

1>&1使用,>&2和/或可以轻松将 stdout 或 stderr 重定向到相同的输出(文件或 2 个 std 输出之一)>file。有没有办法将相同的输出发送到 KSH 中的两个 std 输出(如 | tee 文件,但使用 &2 作为文件)?我尝试同时将流发送到 stdout 和 stderr (复制输出,每个通道一个),但不使用临时对象(变量或文件)

我使用临时变量但尽量避免这种情况

Tempo="$(
   #all my code with output to stdout and stderr
   )"
echo "${Tempo}"
echo "${Tempo}" >&2

提问于堆栈溢出建议在这里提问

答案1

如果你的系统没有/dev/stderr,你可以使用perl这种方式:

{
  your-code
  ..
} | perl -pe 'print STDERR'

perl一次处理一行输入,因此您不会在那里看到部分行。例如,使用如下代码:

printf 'Foo'; sleep 2; printf 'Bar\n'

FooBar2秒后你才会看到。

另请注意,某些命令在不发送到终端时会缓冲其输出,因此这可能会影响输出的完成方式。

答案2

我不知道是否ksh有一个功能可以做到这一点。zsh可以做到(使用该multios功能)。

但有一种方法tee

echo foo | tee /dev/stderr
echo foo | tee /proc/self/fd/2

相关内容