Next: Interactive Shell, Up: Shell [Contents][Index]
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
の値を文字列に変更すると、エラー出力はその名前のバッファーに出力されます。