STDOUT
出力をとして印刷し、出力をディスクのファイルにコピー(ダンプ)するZshスクリプトがあるとします。
また、スクリプトは次のオプションで始まります。
set -o xtrace
これにより、実行されたコマンドが冗長に表示され、印刷されます。この出力をディスク上のファイルにキャプチャしたいと思います。
私の理解は、私がそうするなら
./my_script.sh > log.txt
STDOUT
のみ送信されますが、log.txt
端末でも出力を表示できるようにするにはどうすればよいですか?
私は次tee
の内容を読みました。MULTIOS
Zshにオプションがありますが、どのように使用するのかわかりません。
私がするとき:
./my_script | tee log.txt
ターミナルで出力を見ることができますが、ファイルがlog.txt
すべてをキャプチャできないようです(実際にはほとんど何もキャプチャしません)。
答え1
スクリプトは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
にコピーします。そしてログファイルに。
マルチzsh
OSに対応するものは次のとおりです。
./myscript.sh >&1 > log.txt 2>&1
つまり、stdoutを生のstdoutとlog.txtにリダイレクトしてから(内部的にパイプを介してこれに似たものとしてtee
)、stderrもそこに(tee
内部プロセスパイプと同じものとして)リダイレクトします。
答え2
nohupを使用すると、コンソールが停止または閉じられた場合でも作業を続行でき、長期バックアップなどに役立ちますが、ここでは自動ロギングを使用します。
nohup myscript.sh & ; tail -f nohup.out