我想将某些内容(例如当前日期)打印到 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
其中可能会有点令人惊讶。