web-dev-qa-db-ja.com

出力を画面だけでなくファイルにもリダイレクトする方法は?

私の目的は、スクリプトからのすべての出力を、スクリプトが作成するディレクトリに記録することです。

例えば、私は持っています:

~/.abc.sh

#! /bin/bash
Rails new myapp

実行すると...

cd ~/code
. ~/.abc.sh

...これにより、ディレクトリ~/code/myappに新しいRailsアプリが作成されます。

Railsがアプリを作成するとき、Railsコマンドが新しく作成された同じディレクトリ内のログファイルにキャプチャして保存したいテキストを大量に出力します。ターミナルにもそのテキストを表示したいです。

これを行うにはどうすればよいですか?

10
Zabba

そのためにteeコマンドを使用できます。

command | tee /path/to/logfile

シェルへの書き込みなしの同等の値は次のとおりです。

command > /path/to/logfile

>>)を追加してシェルに出力を表示する場合は、-aオプションを使用します。

command | tee -a /path/to/logfile

パイプはstdoutのみをキャッチし、stderrへのエラーはteeのパイプでは処理されないことに注意してください。 (stderrから)エラーをログに記録する場合は、次を使用します。

command 2>&1 | tee /path/to/logfile

つまり、commandを実行し、stderrストリーム(2)をstdout(1)にリダイレクトします。これは、teeアプリケーションとともにパイプに渡されます。

21
Lekensteyn

script は、対話型セッションを開始してすべての出力(stdout/stderrなど)をファイルに記録するか、(-cパラメーターを使用して)コマンドを実行してその出力を記録します。

script -c ~/.abc.sh -f abc.log

注:対話型セッションでは、通常どおりセッションを終了するだけで記録を停止できます(例:exitまたは Ctrl-D)。

ビデオ再生を伴うセッション記録の場合は、 asciinema を試すこともできます。

0
mwfearnley