STDOUTとSTDERRで印刷(両方とも同じファイルにリダイレクトしません)

STDOUTとSTDERRで印刷(両方とも同じファイルにリダイレクトしません)

STDOUTとSTDERRのいずれかをリダイレクトせずに(現在の日付など)コンテンツを印刷したいと思います。

私は試した:

date 1>&2

しかし、これは単にstdoutをstderrにリダイレクトするようですが、これは私が望むものではありません。同じファイルにマージせずに両方を印刷したいです。

役に立つと確信していますが、どのようにtee使用するのかわかりません。

答え1

何が必要なのか理解している場合は、tee次のコマンドが解決策です。

your_command 2>&1 | tee /dev/stderr

コマンドの出力(つまりerrors date)は標準出力(使用)にリダイレクトされます2>&1。コマンドを使用すると結果が2倍になりますtee

  • 1を標準出力に。
  • パラメータの2番目のファイル:/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方法でターゲットにディスパッチします。

他のシェルでは次のものを提供できます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。これはやや驚くことがあります。

関連情報