web-dev-qa-db-ja.com

EmacsのShell、eshell、termの違いは何ですか?

Emacsでは、次のコマンドを使用してシェルを実行できます-

M-x term

M-x Shell

M-x eshell

これら3つの違いは何ですか?

67
Kshitiz Sharma

Shell は、これら3つの選択肢の中で最も古いものです。 Emacsのcomint-modeを使用してサブシェルを実行します(例:bash)。このモードでは、Emacsを使用してコマンドラインを編集します。 Enterを押すまで、サブプロセスには入力が表示されません。 Emacsはダム端末のように振る舞っています。カラーコードはサポートしていますが、カーソルの移動などはサポートしていないため、cursesベースのアプリケーションを実行できません。

term は、Emacs LISPで記述された端末エミュレーターです。このモードでは、押すキーはサブプロセスに直接送信されます。 Emacsの行編集機能ではなく、Shellが提供する行編集機能を使用しています。また、カーソル移動などの高度なターミナル機能を使用するプログラムを実行することもできます(たとえば、Emacs内でnanoまたはlessを実行できます)。

eshell は、Emacs LISPに直接実装されたシェルです。 bashまたはその他のシェルをサブプロセスとして実行していません。その結果、構文はbashまたはshとまったく同じではありません。これにより、プロセスの出力をEmacsバッファーに直接リダイレクトすることができます(echo hello >#<buffer results>を試してください)。

68
cjm

Xahleeページ によると:

Shellは、オペレーティングシステムのコマンドラインインターフェイスへの標準emacsインターフェイスです。

term(ansi-termは今日のtermとほとんど同じです。これらは異なるパッケージでしたが、現在どちらもterm.elで定義されています)は端末エミュレーターです。 {xterm、gnome-terminal、PuTTY}などの専用端末アプリのように動作します。 emacs Shellインターフェースよりも多くのShellアプリと互換性がありますが、カーソルの移動などの標準のemacsキーはここでは機能しません(端末をエミュレートしているためです)。

eshellは、完全にemacs LISPで記述されたシェルです。注:これはbashエミュレーターではありません。 Eshellはそれ自体がシェルですが、bashや他のシェルに似ています。

どちらを使用しますか?

それはあなたの好みに依存します。

Shellは、{grep、du、ls、sort、cat、head、tail、uname、…}などの、クラシック/標準のUNIXシェルコマンドの一般的な使用に適しています。

term & ansi-termは、sshや他のコマンドラインインタラクティブインターフェイス({python、Ruby、LISP} Shellなど)、またはテキストベースのGUIアプリ({vim、synaptic、…}など)を実行する場合に適しています。

eshellは、bashがインストールされていないMicrosoft Windowsで特に役立ちます。または、emacs LISPプログラマーの場合は、eshellがemacs LISPに直接アクセスできるためです。

20
CodyChan