スクリプトの出力のコピーをファイルに送信する


10

Zshスクリプトがあり、出力をSTDOUTに出力したいが、その出力をディスク内のファイルにコピー(ダンプ)したいとします。

さらに、スクリプトは次のオプションで始まります

set -o xtrace

これにより、詳細になり、実行するコマンドが出力されます。この出力をディスク内のファイルにもキャプチャしたいと思います。

私が理解していることは

./my_script.sh > log.txt

それは単にに送信さSTDOUTlog.txtますが、ターミナルで出力も確認できるようにするにはどうすればよいですか?

私はZsh teeMULTIOSオプションについて読みましたが、それらの使用方法はわかりません。

私がする時:

./my_script | tee log.txt

端末で出力を確認できますが、ファイルはlog.txtすべてをキャプチャしているようには見えません(実際にはほとんど何もキャプチャしていません)。


./my_script.sh > log.txt 2>&1
mikeserv 2014年

scriptコマンドを探しているようです。それともmyscript >&1 > log.txt 2>&1
ステファンChazelas

回答:


12

スクリプトがstdoutand stderrに出力を生成している可能性があります。ログファイルに出力されるのはこれらのストリームの1つだけです。

./my_script.sh | tee log.txt確かにすべてを端末に出力しますがstdout、ログファイルにのみダンプします。

./my_script.sh > log.txt 2>&1 反対を行い、すべてをログファイルにダンプしますが、画面には何も表示しません。

秘訣は、この2つをtee以下と組み合わせることです。

./myscript.sh 2>&1 | tee log.txt

これはstderr2)をstdout1)にリダイレクトし、次ににパイプstdoutします。teeこれにより、ターミナルログファイルにコピーされます。

zsh同等のmultiosは次のようになります。

./myscript.sh >&1 > log.txt 2>&1

つまり、stdoutを元のstdoutとlog.txtの両方にリダイレクトし(内部では、パイプを介してのように動作するものにtee)、次にstderrもそれにリダイレクトします(内部のteeようなプロセスへのパイプに)。


ありがとう-あなたの最後の行について、どう./myscript.sh >&1 2>&1 > log.txtですか?(つまり、最後の2つのリダイレクトの順序を切り替える)。それらの間に何か違いがありますか?
Amelio Vazquez-Reina 2014

あなたのバリアントは、上に出力しないstdoutだけに、log.txt。回答の最後の行(@StéphaneChazelasによって追加されたもので、自分自身ではありません)は両方に出力されます。
savanto 2014年

0

nohupを使用すると、コンソールが停止した場合や閉じた場合でもジョブを続行できます。長時間のバックアップなどに役立ちますが、ここでは自動ログを使用しています。

nohup myscript.sh & ; tail -f nohup.out
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.