合計をコンソール画面に出力し、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!
私の質問は次のとおりです
- ファイルに出力して
stdout
キャプチャする方法は?stderr
(やってみたけど./test|tee 2>log
ダメだった) stderr
両方をファイルに出力してキャプチャするにはどうすればよいですか?
答え1
- stdoutだけを出力してstderrをファイルにキャプチャするにはどうすればよいですか? (./test | tee 2> logを試しましたがうまくいきませんでした)
$ ./test 2>log
OUT!
$ cat log
ERR!
- どちらも出力して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!
または、bash
POSIXシェルを使用せずにを使用している場合は、より単純な形式を使用できます。
$ ./test &>log
$ cat log
OUT!
ERR!
答え2
シェルリダイレクトで十分です。まずstderr
ファイルにリダイレクトします。
$ ./test 2> myfile.txt
stdout
リダイレクトされないので、まだここに画面があります。myfile.txt
ERRが含まれます。
その後、両方とも出力してstderr
ファイルをキャプチャするには、2つのステップでいくつかのコマンド置換を実行する必要があります。
$ ./test 2> >(tee myfile.txt >&2)
これにより、エラーストリームがプロセスtee
に送信され、エラーが再印刷されます。stdout
絶え間ない。詳細については、このスタックオーバーフローの質問を確認してください。。
stdout
同様に、ファイルをキャプチャしてそのままにしたい場合はstderr
...
$ ./test > >(tee myfile.txt)
答え3
まあ、男性と女性...
このスレッドを豊かにするために、一般的な単純化されたケースで答えを投稿するのが最善だと思います。
stdoutとstderrを端末に出力し、stdoutとstderrをファイルとしてキャプチャします。
stdoutとstderrが端末とファイルに出力されるかどうかをテストしてください...
rm -f test.log
ping 127.0.0.1 -c 6 2>&1 | tee test.log
cat test.log
端末とファイルにstderrが出力されていることを確認してください...
rm -f test.log
ping e.r.r.or -c 6 2>&1 | tee test.log
cat test.log
ありがとうございます! =D
[参照番号:https://stackoverflow.com/a/12928057/3223785]