Zshスクリプトがあり、出力をSTDOUT
に出力するだけでなく、その出力をディスク内のファイルにコピー(ダンプ)したいとします。
さらに、スクリプトは次のオプションで始まります
set -o xtrace
これにより、強制的に冗長になり、実行するコマンドを出力します。この出力をディスク内のファイルにもキャプチャしたいと思います。
私が理解していることは
./my_script.sh > log.txt
STDOUT
をlog.txt
に送信するだけですが、ターミナルで出力も確認できるようにするにはどうすればよいですか?
Zshのtee
および MULTIOS
オプションについて読みましたが、それらの使用方法がわかりません。
私がする時:
./my_script | tee log.txt
端末で出力を確認できますが、ファイルlog.txt
はすべてをキャプチャしているようには見えません(実際、ほとんど何もキャプチャしていません)。
スクリプトがstdout
と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
これにより、stderr
(2
)からstdout
(1
)、次にstdout
をtee
にパイプし、それをターミナルにコピーしますandをログファイルにコピーします。
zsh
multiosは次のようになります。
./myscript.sh >&1 > log.txt 2>&1
つまり、stdoutを元のstdoutとlog.txtの両方にリダイレクトし(内部でパイプを介してtee
のようなものにパイプします)、次にstderrもそれにリダイレクトします(内部のtee
のようなプロセス)。
Nohupを使用すると、コンソールが停止した場合や閉じた場合でもジョブを続行でき、長時間のバックアップなどに役立ちますが、ここでは自動ログを使用しています。
Nohup myscript.sh & ; tail -f Nohup.out