Next: , Up: Shell   [Contents][Index]


37.1 単一のシェルコマンド

M-! (shell-command)は、ミニバッファーを使って1行のテキストを読み取り、それをシェルコマンドとして、そのコマンドのためだけに作成されたサブシェルで実行します。そのコマンドの標準入力はnullデバイスです。シェルコマンドが出力を生成する場合、その出力はエコーエリア(出力が短い場合)、または別のウィンドウの*Shell Command Output*という名前のEmacsバッファー(出力が長い場合)に表示されます。

たとえばfoo.gzという名前のファイルを解凍する1つの方法は、M-! gunzip foo.gz RETとタイプすることです。このシェルコマンドは通常、ファイルfooを作成して、端末出力を生成しません。

たとえばM-1 M-!のようにshell-commandに数引数を指定した場合、別のバッファーではなく、カレントバッファーに端末出力を挿入します。これはポイントを出力の前に配し、出力の後にマークを配します。たとえばM-1 M-! gunzip < foo.gz RETは、カレントバッファーにファイルfoo.gzの解凍された内容を挿入します。

最後が‘&’でないシェルコマンドを指定した場合、コマンドは同期(synchronously)で実行され、Emacsを継続して使用するには、コマンドがexitするのを待たなければなりません。待つのを中止するには、C-gとタイプします。これはシェルコマンドを終了するために、シグナルSIGINTを送ります(これは通常、シェルでC-cとタイプしたときに生成されるのと同じシグナルです)。その後、Emacsはコマンドが実際に終了するまで待ちます。シェルコマンドが終了しない場合(そのコマンドがシグナルSIGINTを無視する場合)は、再度C-gとタイプします。これは そのコマンドにたいして、無視することが不可能なシグナルSIGKILLを送ります。

&’で終わるシェルコマンドは非同期(asynchronously)で実行され、それを実行した後でも、継続してEmacsを使用できます。シェルコマンドを非同期で実行する前に、M-& (async-shell-command)とタイプすることもできます。これは最後の‘&’が必要ない点を除き、最後に‘&’を指定してM-!を呼び出すことと同じです。非同期シェルコマンドにたいするデフォルトの出力バッファーは、‘*Async Shell Command*’という名前のバッファーです。このバッファーがウィンドウに表示されているかに関わらず、Emacsは出力をこのバッファーに挿入します。

同時に複数の非同期シェルコマンドを実行した場合、出力バッファーが競合します。この場合どのようにするか — たとえば既存の出力バッファーをリネームしたり、新しいコマンドに異なるバッファーを使用する — を、オプションasync-shell-command-bufferで指定できます。他の可能なオプションについては、この変数のドキュメントを参照してください。

M-| (shell-command-on-region)はM-!と同様ですが、入力を与えないかわりに、リージョンの内容をシェルコマンドの標準入力として渡します。数引数を指定した場合、古いリージョンの内容を、シェルコマンドの出力で置き換えます。

たとえばM-|gpgプログラムを使用して、そのバッファーのキーが何かを見ることができます。そのバッファーがGnuPGキーを含む場合、C-x h M-| gpg RETとタイプして、バッファー全体の内容をgpgに送ることができます。これはキーのリストを、*Shell Command Output*バッファーに出力します。

上記のコマンドは、変数shell-file-nameで指定されたシェルを使用します。この変数のデフォルト値は、Emacsが開始されたときの環境変数SHELLにより決定されます。相対ファイル名の場合、Emacsはexec-pathにリストされたディレクトリーを検索します(Shellを参照してください)。

M-!またはM-|にたいするコーディングシステムを指定するには、あらかじめコマンドC-x RET cを使用します。Communication Codingを参照してください。

デフォルトでは、出力バッファーではエラー出力と標準出力が混ざって出力されます。しかし変数shell-command-default-error-bufferの値を文字列に変更すると、エラー出力はその名前のバッファーに出力されます。