Next: , Previous: , Up: プログラムのコンパイルとテスト   [Contents][Index]


28.3 コンパイルのためのサブシェル

このセクションには、compilationバッファー内で、シェルやその機能を使用するための、さまざまなテクニックとアドバイスが含まれています。ローカルでのコンパイルに特有なトピックを扱うので、デフォルトディレクトリーがリモートホスト上であるようなcompilationバッファーでは、おそらくほとんどは機能しない(または無関係)でしょう。

M-x compileコマンドは、コンパイルコマンドを実行するためにシェルを使いますが、オプションで非対話的なシェルを指定します。これは、シェルがプロンプトなしで開始されることを意味します。*compilation*バッファーで、通常のシェルプロンプトの見映えがよくない場合、それはシェルの初期化ファイルで、無条件にプロンプトをセットするという間違いを犯していることを意味します(この初期化ファイルは使用しているシェルに応じて.bashrc.profile.cshrc.shrcなどの名前がついています)。シェルの初期化ファイルでは、プロンプトがすでにあるときだけプロンプトをセットするべきです。これをbashで行うには、以下のようにします:

if [ "${PS1+set}" = set ]
then PS1=…
fi

cshで行うには以下のようにします:

if ($?prompt) set prompt = …

compilationのサブシェルに渡す環境変数TERMの値をカスタマイズしたい場合は、変数comint-terminfo-terminalの値をカスタマイズしてください(Shellモードのオプションを参照)。

Emacsは、コンパイラープロセスが非同期なサブプロセスで実行されることを要求しません。もしこれを行う場合、メインのコンパイラープロセスが終了した後で、サブプロセスがまだ実行中のときは、Emacsはこれらをkillするか、それらの出力はEmacsには到達しません。この問題を避けるには、メインのコンパイルプロセスが、それのサブプロセスの終了までwaitするようにします。シェルスクリプトでは、以下のように‘$!’と‘wait’を使用して、これを行うことができます:

(sleep 10; echo 2nd)& pid=$!  # サブプロセスのpidを記録
echo first message
wait $pid                     # サブプロセスのwait

バックグラウンドのプロセスがcompilationバッファーに何も出力せず、メインのコンパイルプロセスが終了したときに、これらがkillされるのを防ぐことだけが必要な場合は、以下で充分です:

nohup command; sleep 1

MS-DOSオペレーティングシステムでは、非同期なサブプロセスはサポートされていないので、M-x compileはコンパイルコマンドを同期実行します(たとえばEmacsで他のことを行うには、コマンドが終了するまで待たなければなりません)。EmacsとMS-DOSを参照してください。