stderr、stdoutをコンソールに出力し、同時にファイルに保存する

stderr、stdoutをコンソールに出力し、同時にファイルに保存する

合計をコンソール画面に出力し、stdoutそのstderrいずれかをログファイルに保存できますか?

テストシェルスクリプトを作成しました。

#!/bin/sh

echo OUT! >&1
echo ERR! >&2

スクリプトを実行して画面に出力できます。

$./test 
OUT!
ERR!

次のように出力し、stderrログstdoutファイルとしてキャプチャできます。

$./test | tee 1>log
ERR!

$cat log 
OUT!

stdout何も出力できません。すべてをキャプチャして、次のようにログファイルに書き込むことができますstderro

$./test 2>&1| tee 1>log

$cat log 
OUT!
ERR!

以下を使用して合計を出力し、stdoutすべてstderrログファイルにキャプチャできます。

$./test 2>&1 | tee log
OUT!
ERR!

$cat log 
OUT!
ERR!

stdout次のようにログファイルを出力できます。

$./test | tee 2>&1 log
ERR!
OUT!

$cat log 
OUT!

私の質問は次のとおりです

  1. ファイルに出力してstdoutキャプチャする方法は?stderr(やってみたけど./test|tee 2>logダメだった)
  2. stderr両方をファイルに出力してキャプチャするにはどうすればよいですか?

ベストアンサー1

  1. stdoutだけを出力してstderrをファイルにキャプチャするにはどうすればよいですか? (./test | tee 2> logを試しましたがうまくいきませんでした)
$ ./test 2>log
OUT!
$ cat log
ERR!
  1. どちらも出力してstderrをファイルにキャプチャするにはどうすればよいですか?
$ ./test 2>&1 >/dev/tty | tee log
OUT!
ERR!
$ cat log
ERR!

この式がより大きなパイプの一部である場合は、これを避けることをお勧めします/dev/tty。 1つの方法はstdoutとstderrを置き換えることです。この交換を実行するには、次のように3番目のファイルハンドルを作成する必要があります。

$ exec 3>&1; ./test 2>&1 1>&3 | tee log; exec 3>&-
OUT!
ERR!
$ cat log
ERR!

最初のステートメントは、exec 3>&1ファイルハンドル3を現在の標準出力(何でも)に割り当てます。その後、stderrはコマンド./test 2>&1 1>&3 | tee logにパイプされ、stdoutはファイルハンドル3に送信されます。tee最後に、円滑な管理のためにexec 3>&-ファイルハンドル3を閉じます。

追加のメモとコメント

について:

次のようにしてstderrを出力し、stdoutをログファイルとしてキャプチャできます。

$./test | tee 1>log
ERR!
$cat log 
OUT!

次のように単純化できます。

$ ./test >log
ERR!
$ cat log
OUT!

また、以下に関連して:

何も出力できず、次のようにすべてのstdoutとstderroをログファイルとしてキャプチャすることができます。

$ ./test 2>&1| tee 1>log
$ cat log 
OUT!
ERR!

次のように単純化できます。

$ ./test >log 2>&1
$ cat log
OUT!
ERR!

または、bashPOSIXシェルを使用せずにを使用している場合は、より単純な形式を使用できます。

$ ./test &>log
$ cat log
OUT!
ERR!

おすすめ記事