プログラムを実行するための新しいサブプロセスを作成するプリミティブが3種類あります。そのうちの1つであるmake-processは、非同期プロセスを作成し、プロセスオブジェクトを返します(非同期プロセスの作成を参照)。残りの2つであるcall-processとcall-process-regionは、同期プロセスを作成し、プロセスオブジェクトは返しません(同期プロセスの作成を参照)。これらのプリミティブを利用して、特定の種類のプロセスを実行するさまざまな高レベル関数が用意されています。
同期処理と非同期処理については、以下の節で説明します。3つの関数はいずれも同様の形式で呼び出されるため、ここでは共通の引数について記述します。
いずれの場合も、関数は実行するプログラムを指定します。ファイルが見つからないか、あるいは実行できない場合はエラーが通知されます。ファイル名が相対パスの場合、変数
exec-path には検索対象のディレクトリ一覧が格納されます。Emacs は起動時に、環境変数
PATH の値に基づいて exec-path
を初期化します。標準的なファイル名構成要素である ‘~’、‘.’、および
‘..’ は、exec-path 内で通常通り解釈されますが、環境変数の置換(‘$HOME’ など)は認識されません。置換を行うには substitute-in-file-name を使用してください(ファイル名を展開する関数 を参照)。このリスト内の nil は default-directory
を参照します。
プログラムの実行時に、指定した名前に接尾辞を追加してみることもできます。
この変数は、指定したプログラムファイル名に追加を試みる接尾辞(文字列)のリストです。ファイル名を指定通りにそのまま試したい場合は、リストに "" を含めてください。デフォルト値はシステムによって異なります。
この関数は、変数 exec-suffixes の接続ローカル値を返します。
ご注意: 引数 program にはプログラムファイル名のみが含まれており、コマンドライン引数を含めることはできません。これらを指定するには、後述の通り、別途引数 args を使用する必要があります。
サブプロセスを生成する各関数には、プログラムの出力先を指定する buffer-or-name
引数があります。これはバッファまたはバッファ名である必要があります。バッファ名を指定した場合、バッファが存在しないときは新たに作成されます。また、nil を指定することもでき、この場合はカスタムフィルタ関数で処理されない限り、出力が破棄されます。(プロセスフィルタ関数 および Lispオブジェクトの読み込みと出力
を参照してください。)通常、複数のプロセスが同じバッファに出力を送ることは、出力がランダムに混在してしまうため避けるべきです。同期プロセスの場合は、バッファの代わりにファイルに出力を送ることができます(そのため、対応する引数は
destination
と呼ぶのがより適切です)。デフォルトでは、標準出力と標準エラーストリームはどちらも同じ出力先に向かいますが、これら3つのプリミティブはいずれも、標準エラーストリームを別の出力先に任意で指定することが可能です。
サブプロセス生成関数3つはいずれも、実行するプロセスのコマンドライン引数を指定できます。call-process および call-process-region の場合、これらは &rest 引数である args
の形式で指定されます。make-process
の場合、実行するプログラムとそのコマンドライン引数の両方が、文字列のリストとして指定されます。コマンドライン引数はすべて文字列である必要があり、個別の引数文字列としてプログラムに渡されます。これらの文字列は指定されたプログラムに直接渡されるため、ワイルドカード文字やその他のシェル構文は特別な意味を持ちません。
サブプロセスはEmacsから環境を継承しますが、process-environment
で上書きを指定できます。オペレーティングシステム環境を参照してください。サブプロセスは default-directory の値からカレントディレクトリを取得します。
この変数の値は文字列であり、GNU Emacsに付属し、Emacsが呼び出すことを想定したプログラムが格納されているディレクトリ名です。プログラム
movemail はその一例であり、Rmail はこれを用いて受信トレイから新着メールを取得します。
この変数の値は、サブプロセスで実行するプログラムを検索するためのディレクトリ一覧です。各要素は、ディレクトリ名(すなわち文字列)、またはデフォルトディレクトリ(default-directoryの値)を表すnilのいずれかです。この検索の詳細については、executable-findを参照してください。
program 引数が絶対ファイル名でない場合、exec-path の値は call-process および
start-process で使用されます。
原則として、exec-path を直接変更すべきではありません。代わりに、Emacs
を起動する前に環境変数 PATH が適切に設定されていることを確認してください。PATH とは独立して exec-path
を変更しようとすると、予期せぬ結果を招く可能性があります。
この関数は、変数 exec-path を拡張したものです。default-directory
がリモートディレクトリを指定している場合、この関数は各リモートホスト上でプログラムを検索するために使用されるディレクトリの一覧を返します。ローカルの
default-directory の場合は、変数 exec-path の値のみを返します。この関数で exec-suffixes を使用する場合は、変数の代わりに関数 exec-suffixes も使用する必要があります。
Emacsディストリビューションに含まれるプログラムを起動する際は、システム上の実行ファイルの命名制限に準拠するため、プログラム名が変更されている可能性があることに留意する必要があります。
例えば emacsclient から始めるのではなく、代わりに emacsclient-program-name の値を指定すべきです。同様に、movemail から始めるのではなく、movemail-program-name から始めなければならず、etags、hexl、rcs2log、ebrowse についても同様です。