次: , 上: Shell


27.14.1 単一のシェルコマンド

M-!shell-command)は、新たに作ったサブシェルにて、 ミニバッファで読み取った1行のテキストをシェルコマンドとして実行します。 シェルコマンドの標準入力はnull装置(つまり空)です。 シェルコマンドの出力があれば、`*Shell Command Output*'という名前の Emacsバッファに入れて別のウィンドウに表示しますが、 (カレントバッファには)選択しません。 M-1 M-!のように数引数を指定すると、 シェルコマンドの出力をカレントバッファに挿入します。 その場合、ポイントは(挿入された)出力の先頭に置かれ、 マークは出力の末尾に置かれます。

シェルコマンドの末尾が`&'になっていると、 シェルコマンドは非同期に実行されます。 同期実行のシェルコマンドでは、Lispプログラムから呼ばれたときには、 shell-commandはコマンドの終了状態(0は成功を意味する)を返します。

M-|shell-command-on-region)はM-!と同様ですが、 シェルコマンドの標準入力は空ではなくリージョンの内容が引き渡されます。 数引数を指定すると、それまでのリージョンは削除され シェルコマンドの出力で置き換わり新たなリージョンになります。 このコマンドは、Lispプログラムから呼ばれたときには、 コマンドの終了状態を返します。

M-!M-|も、使用するシェルはshell-file-nameで指定します。 この変数は、Emacs起動時の環境変数SHELLをもとに初期設定されます。 ファイル名にディレクトリが指定されていなければ、 exec-pathに指定されているディレクトリ群を探索します。 exec-pathの値は、Emacs起動時の環境変数PATHを もとに初期設定されます。 個人のファイル.emacsで これらの変数の初期値を自由に変更してかまいません。

M-!M-|もシェルコマンドの実行完了を待ち合わせます。 待つのをやめたい場合は、C-gで中断できます。 この場合、シェルコマンドはシグナルSIGINTで終了させられます。 このシグナルは、シェルを使用中にC-cが普通に送るシグナルと同じです。 Emacsはシェルコマンドが実際に終了するまで待ちます。 シェルコマンドが(シグナルSIGINTを無視して)停止しない場合は、 再度C-gを打ちます。 すると、無視できないシグナルSIGKILLをシェルコマンドに送ります。

M-!M-|で使用するコーディングシステムを指定するには、 これらのコマンドの直前にコマンドC-x <RET> cを使います。 See Specify Coding

コマンドからのエラー出力は、通常、普通の出力と混ざり合ってしまいます。 変数shell-command-default-error-bufferに バッファ名の文字列を設定すると、 その名前のバッファのポイント位置のまえにエラー出力が挿入されます。