Welcome to my web page. This page is written in Japanese.
Code is EUC-JP.

Log を残す (ログをとるには)

ログとは

ログとは、簡単に言えば、履歴などの記録をとっておくこと。もしくはその記録そのもののことです。
アプリケーションをソースファイルからコンパイルするときなどは特に、make コマンドの実行はログ (log) を取っておきたい場合が多いと思います。以前に較べれば格段に少なくなってきましたが、やはりコンパイル中にエラーで終了してしまうことがあるからです。
エラーの原因を自分で調べるにしろ、誰か詳しい人に尋ねるにしろ、ログとして記録を取っておけば、それが必ず役に立ちます。
UNIX 系システムにおける、プログラムのコンパイルやインストールのログファイルの残し方にはいくつか方法があります。主な方法を以下に挙げます。
ここでは、それぞれの手法とコマンドの簡単な使い方を解説します。

リダイレクト

最も簡単なログの取り方は、リダイレクトを使う方法でしょう。
例えば make コマンドを実行するとき、その出力をリダイレクトして "Make.log" というファイルに出力のログを残すためには以下のように make コマンドを実行します。
$ make >Make.log 2>&1
上記は B Shell (Bourne Shell) 系シェルを使用している場合です。もし C Shell 系シェルを使用しているならば以下のように make コマンドを実行します。
$ make >& Make.log
上記の方法は、どちらのシェルの場合も標準出力だけでなく標準エラー出力もファイルに残すようにリダイレクトしています。
しかし、これでは make コマンドが終了するまでシェルのプロンプトは戻らないため、どこまでコンパイルが進んだのか判りません。そのため make の実行はバックグランドで行ない、コマンド tail を使ってログを表示させる方法がよく使われます。
以下はコマンド tail を使って、make コマンドの実行の様子を確認する例です。
$ make >Make.log 2>&1 &
[1] 9561
$ tail -f Make.log
上記は B Shell 系シェルを使用している場合の例です。もし C Shell 系シェルを使用しているならば以下のように make コマンドと tail コマンドを実行します。
$ make >& Make.log &
[1] 9489
$ tail -f Make.log
この方法の短所は、コマンドの終了時がわからないことです。tail コマンドは、オプション "-f" を与えて実行したときは自分で終了はしませんので、上記の例ですと make が終了したときがわかりません。エラー終了の場合はその旨がたいてい表示されるので判る場合もありますが、ほとんどの場合は、頃合を見計らって自分でコマンド tail を中断する必要があります。

tee コマンド

たいていの UNIX 系システムには、コマンド tee が標準で用意されています。このコマンド tee は標準入力から読み取り、その読み取った内容を標準出力とファイルに書き出すコマンドです。このコマンドを使ってログをファイルに残すことができます。
例えば make を実行するとき、その出力を "Make.log" というファイルに残すためには以下のように make コマンドと tee コマンドを実行します。
$ make 2>&1 | tee Make.log
上記は B Shell 系シェルを使用している場合の例です。もし C Shell 系シェルを使用しているならば以下のように make コマンドと tee コマンドを実行します。
$ make |& tee Make.log
この方法であれば、リダイレクトの方法と違い、コマンドの終了時が判ります。コマンドの出力だけを得る分には良い方法でしょう。
この方法の短所は、先のリダイレクトも同様ですが、コマンド実行の履歴などのログが取れないことです。コマンドの出力については、ログをとることができますが、自分が何を実行したのか、といったログをとることはできません。

script コマンド

前述しましたが、コマンドの出力だけでなく、コマンド実行の履歴など、自分が入力して実行したコマンド名や、実行の際のオプションなどの引き数も含めて全てログを残したい場合には、リダイレクトや tee コマンドを使った方法では難しいです。
そのような実行履歴 (ヒストリ, history) なども含めてログを残したい場合の方法の一つは、コマンド script を使用することです。このコマンドもたいていの UNIX 系システムには標準で用意されています。
コマンド script のデフォルトの動作は、端末上に表示されたもの全てを "typescript" という名前のファイルにログを残します。script コマンドの実行例を以下に挙げます。
$ script 
Script started, file is typescript
$ make
 ...
$ exit
Script done, file is typescript
コマンド script を実行して、"Script started, file is typescript" と出力されたあと、通常のシェルのプロンプトが表示されますが、コマンド script はちゃんと動いており、あなたの入力した文字やコマンドの出力を全て "typescript" というファイルに残しています。コマンド script を終了するにはシェルを終了させます。
この方法であれば、ユーザーが入力した内容も含めて全てがログに記録されます。
もし別のファイル名でログをのこしたい場合には、script コマンドの引き数でファイル名を与えます。 以下は "INSTALL.log" というファイルにログを残す場合の script コマンドの実行例です。
$ script INSTALL.log
Script started, file is INSTALL.log
$ make
 ...
$ exit
Script done, file is INSTALL.log
このコマンド script を使う方法の短所をあえて挙げるならば、ログファイルの各行の最後に "^M" が記録されていることでしょう。もし気になるのでしたら、これは sed や perl などを使用して自分で取り除くしかありません。
例えば perl であれば、以下のように実行することで各行末の "^M" を取り除くことができます。
$ perl -p -e 's/\r$//;' -i.bak logfile
ここで "logfile" はログファイル名であり、上記を実行すると "logfile.bak" というバックアップファイルを残して、各行末の "^M" を取り除いた "logfile" を作成します。

screen コマンド

コマンド screen を使ってログを残す方法もあります。コマンド screen は端末エミュレータで、仮想的に複数の端末を持つことができ、一旦抜けてから後で復旧させることができるなどの便利なソフトウェアです。
そして、このコマンド screen にもログをとる機能があります。デフォルトで使用している場合は "C-aH" でログを取るようになります。
ただし、この方法でもコマンド script と同じようにログの各行の最後に "^M" が記録される短所があります。もし気になるのでしたら、同様に sed や perl を使って自分で取り除くことになります。

shell-mode

Emacs の shell-mode を利用してログをとる方法もあります。著者は、この方法がログのとり方として最もやりやすい方法なので、mule 上でのこの方法をよく利用しています。
~/.emacs に以下の記述をしておくことで、Emacs の起動時に shell-mode が働きます。
(shell)
もしくは、既に起動している Emacs 上で "M-x shell" とタイプすることでも shell-mode が起動します。vi のような端末画面を操作するアプリケーションは通常使えないことを除けば非常に便利な方法です。
ただしこの方法でも、環境によっては、各行の最後に "^M" が付いてしまう場合があります。そのような場合は、shell-modeM-x shell-strip-ctrl-m もしくは M-x comint-strip-ctrl-m とタイプしてみてください。tcsh を使用している場合、これでも直らないときがあります。その場合は以下の内容を ~/.cshrc もしくは ~/.tcshrc に記述してみてください。
  if ($?EMACS) then
     if ("$EMACS" == t) then
        if ($?tcsh) unset edit
        stty nl
     endif
  endif

ログを取ることは大事

Linux の Debian や RedHat などのバイナリパッケージをインストールする場合ならばともかく、ソースファイルから自分でコンパイル、インストールをする場合には、必ずログを取る習慣を付けましょう。
エラーの原因を調べるだけでなく、後日バージョンアップしたソフトウェアを再度ソースファイルからインストールする必要が生じたときにも、「以前はどのようにしてインストールしたか」という記録が残っていると、作業がしやすいです。
くり返しますが、インストール作業では、必ずログをとる習慣を付けましょう。