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
に
バッファ名の文字列を設定すると、
その名前のバッファのポイント位置のまえにエラー出力が挿入されます。