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
。これはやや驚くことがあります。