出力を画面とファイルにリダイレクトする方法は?


12

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

たとえば、私は:

~/.abc.sh

#! /bin/bash
rails new myapp

走ると...

cd ~/code
. ~/.abc.sh

...ディレクトリに新しいRailsアプリを作成します~/code/myapp

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

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

回答:


23

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アプリケーションと共にパイプに渡されます。


もしかして~/.abc.sh | tee <file>?もしそうなら、問題は私がそれを呼び出すときにスクリプトがアプリを作成しようとしているディレクトリがわからないので、どうすればfile引数に何を与えるのかわかりますか?(すばらしい例をありがとう)
Zabba

@Zabba:一時ファイルを作成して後で移動するのはどうですか?
Lekensteyn

OK、それはうまくいくはずです:)。それに関して、ランダムな名前で一時ファイルを作成して、出力したり、後で目的の場所にコピーしたりするにはどうすればよいですか?「一時ファイル名」を取得するための組み込みコマンドはありますか?
Zabba

@Zabba:そのためのコマンドはmktempです。マニュアルページを参照してくださいman mktemp
Lekensteyn

怯える、魅力のような仕事
Sun Junwen

0

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

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

注:インタラクティブセッションでは、通常どおりにセッションを終了するだけで(例:exitまたはCtrl-D)、記録を停止できます。

ビデオ再生を伴うセッション録画の場合は、アスキーネマを試すこともできます。

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