M-! (shell-command)
は、ミニバッファを使用してテキストの1行を読み込み、そのコマンド専用に作成されたサブシェル内でシェルコマンドとして実行します。コマンドへの標準入力はヌルデバイスから供給されます。シェルコマンドが出力を生成した場合、その出力は(短い場合は)エコー領域に、(長い場合は)‘"*Shell Command Output*"’ (shell-command-buffer-name) バッファに表示されます。変数 resize-mini-windows と max-mini-window-height(ミニバッファでの編集 を参照)は、Emacs
が出力をエコー領域に対して長すぎると判断するタイミングを制御します。なお、後述する shell-command-dont-erase-buffer
のカスタマイズによって、エコー領域に表示される内容が影響を受ける可能性があることに注意してください。
例えば、foo.gz という名前のファイルを展開する方法の一つに、M-! gunzip foo.gz RET と入力することがあります。このシェルコマンドは通常、foo というファイルを作成し、ターミナルへの出力は行いません。
shell-command に数値引数(例:M-1
M-!)を指定すると、ターミナル出力を別バッファではなく現在のバッファに挿入します。デフォルトでは、出力の前にポイントを置き、出力の後にマークを設定します(ただし、デフォルト以外の値である
shell-command-dont-erase-buffer
を指定するとこの動作を変更できます。詳細は後述)。例えば、M-1 M-! gunzip < foo.gz
RET を指定すると、ファイル foo.gz の非圧縮形式が現在のバッファに挿入されます。
指定したシェルコマンドが ‘&’
で終わっていない限り、そのコマンドは同期的に実行され、Emacsを使い続ける前にその終了を待つ必要があります。待機を停止するには、C-g と入力して終了してください。これによりシェルコマンドを終了させる SIGINT シグナルが送信されます(これは通常、シェル内で C-c
が生成するのと同じシグナルです)。その後、Emacsはコマンドが実際に終了するまで待機します。シェルコマンドが(SIGINT シグナルを無視して)停止しない場合は、再度 C-g
と入力してください。これによりコマンドに SIGKILL
シグナルが送信され、このシグナルを無視することは不可能です。
‘&’ で終わるシェルコマンドは非同期に実行され、実行中もEmacsを使い続けることができます。また、M-& (async-shell-command)
と入力してシェルコマンドを非同期に実行することも可能です。これは、末尾に‘&’を付けてM-!を呼び出すのと全く同じですが、‘&’は不要です。非同期シェルコマンドの出力は、デフォルトでは‘"*Async Shell Command*"’バッファ (shell-command-buffer-name-async)
に送られます。Emacsは、バッファがウィンドウに表示されているかどうかにかかわらず、出力が届くたびにこのバッファに挿入します。
複数の非同期シェルコマンドを同時に実行する場合、出力バッファを巡って競合が発生する可能性があります。オプション async-shell-command-buffer
では、これにどう対処するか(例えば、既存の出力バッファの名前を変更するか、あるいは新しいコマンドに別のバッファを使用するかなど)を指定します。その他の選択肢については、変数のドキュメントを参照してください。
非同期シェルコマンドの出力バッファを、コマンドが出力を生成した場合にのみ表示するようにするには、async-shell-command-display-buffer を nil に設定してください。
オプション async-shell-command-width
は、非同期シェルコマンドの出力に使用可能な表示列数を指定します。正の整数を指定すると、シェルはその列数をコマンド出力に使用します。デフォルト値は
nil で、これはシェルが提供する列数と同じ数を使用することを意味します。
上記のコマンドのプロンプトにカレントディレクトリを表示させるには、変数 shell-command-prompt-show-cwd を nil 以外の値に設定してください。
M-| (shell-command-on-region) は M-!
と同様ですが、入力なしではなく、リージョンの内容をシェルコマンドの標準入力として渡します。数値引数を指定すると、古いリージョンを削除し、シェルコマンドの出力で置き換えます。
例えば、gpg プログラムで M-|
を使用すると、バッファにどのような鍵が含まれているかを確認できます。バッファに GnuPG 鍵が含まれている場合は、C-x h M-| gpg RET と入力してバッファの内容全体を
gpg に渡します。これにより、shell-command-buffer-name の値を名前とするバッファ内の鍵の一覧が出力されます。
上記のコマンドは、変数 shell-file-name
で指定されたシェルを使用します。そのデフォルト値は、Emacs 起動時に環境変数 SHELL
によって決定されます。ファイル名が相対パスの場合、Emacs は exec-path
に列挙されたディレクトリを検索します(Emacs
からシェルコマンドを実行する を参照)。
デフォルトディレクトリがリモートの場合(リモートファイルを参照)、デフォルト値は /bin/sh となります。これは、shell-file-name を接続ローカルとして宣言することで変更可能です(接続ごとのローカル変数を参照)。
M-! または M-| の符号化方式を指定するには、その直前に C-x RET c コマンドを使用します。プロセス間通信の符号化方式 を参照してください。
デフォルトでは、エラー出力は出力バッファ内で通常の出力と混在します。ただし、変数 shell-command-default-error-buffer
の値を文字列に変更すると、エラー出力はその名前のバッファに挿入されます。
デフォルトでは、出力が現在のバッファに送られる場合を除き、シェルコマンド間で出力バッファは消去されます。オプション shell-command-dont-erase-buffer の値を erase に変更すると、出力バッファは常に消去されます。nil
以外の値を指定すると出力バッファの消去が防止され、さらに—出力バッファが現在のバッファでない場合—シェルコマンドの出力を挿入した後のポイントの位置も制御されます:
beg-last-out直前のシェルコマンド出力の先頭にポイントを置きます。
end-last-out直前のシェルコマンド出力の末尾、すなわち出力バッファの末尾にポイントを置きます。
save-pointshell-commandの出力を挿入する前のポイントの位置を復元します。
なお、このオプションが nil
以外の場合、エコー領域には出力バッファの一部のみが表示されるため、表示される内容は直前のコマンドによるものとは限らない点にご注意ください。
出力バッファが現在のバッファでない場合、シェルコマンドの出力がこのバッファの末尾に追加されます。