web-dev-qa-db-ja.com

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

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

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

set -o xtrace

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

私が理解していることは

./my_script.sh > log.txt

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

Zshのteeおよび MULTIOS オプションについて読みましたが、それらの使用方法がわかりません。

私がする時:

./my_script | tee log.txt

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

10

スクリプトがstdoutstderrに出力を生成していて、これらのストリーム出力の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)、次にstdoutteeにパイプし、それをターミナルにコピーしますandをログファイルにコピーします。

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

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

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

12
savanto

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

Nohup myscript.sh & ; tail -f Nohup.out
0
zzapper