将某些内容打印到 STDOUT 和 STDERR (无需将两者重定向到同一文件)

将某些内容打印到 STDOUT 和 STDERR (无需将两者重定向到同一文件)

我想将某些内容(例如当前日期)打印到 STDOUT 和 STDERR,而不重定向其中任何一个。

我试过:

date 1>&2

但我认为这只是将 stdout 重定向到 stderr,这不是我想要的。我想打印到两者,而不将它们合并在同一个文件中。

我相信tee会有帮助,但我不知道如何使用它。

答案1

如果我明白你想要什么,tee命令就是解决方案:

your_command 2>&1 | tee /dev/stderr

命令的输出错误(即date)被重定向到标准输出(带有2>&1)。使用命令,结果加倍tee

  • 1到标准输出;
  • 参数中的第二个文件:/dev/stderr

那么,命令的结果date是:

> date 2>&1 | tee /dev/stderr
Sun Dec 11 16:33:35 CET 2022
Sun Dec 11 16:33:35 CET 2022

因此,您可以使用>/>>2>/重定向2>>到您想要的任何文件:

> date 2>&1 | tee /dev/stderr >file1 2>file2
> cat file1
Sun Dec 11 16:40:59 CET 2022
> cat file2
Sun Dec 11 16:40:59 CET 2022

如果发生错误,使用错误的命令,例如datex

> datex 2>&1 | tee /dev/stderr >file1 2>file2
> cat file1
bash: datex: command not found...
> cat file2
bash: datex: command not found...

答案2

zsh,这只是

date >&1 >&2

在 zsh 中,除非multios禁用该选项,否则当 fd 多次重定向以进行输出时,zsh 会将其重定向到管道并从另一端读取数据,以tee类似的方式将其分派到目标。

在其他 shell 中,您可以使用以下命令进行发球perl

date | perl -ne 'BEGIN{$/=\8192} print; print STDERR'

在 Cygwin 和基于 Linux 的系统之外的系统上,您可以执行以下操作:

date | tee /dev/stderr

在 Linux/Cygwin 上应该避免这种情况,打开/dev/stderr尝试重新打开 /dev/stderr 指向的文件,并且写入结果文件描述符与写入 stderr 不同。不过,当 stderr 在管道或 tty 设备上打开时(通常是这样),它在功能上应该是等效的。


1 并注意其中包含管道,因为cmd >&2 | cmd2其中可能会有点令人惊讶。

相关内容