Was ist der Unterschied zwischen Shell, Eshell und Term in Emacs?

60

In Emacs kann ich eine Shell mit folgenden Befehlen ausführen:

M-x term

M-x shell

M-x eshell

Was ist der Unterschied zwischen diesen drei?

Kshitiz Sharma
quelle

Antworten:

61

shellist die älteste dieser 3 Möglichkeiten. Es benutzt Emacs comint-modeum eine Subshell zu starten (zB bash). In diesem Modus bearbeiten Sie mit Emacs eine Befehlszeile. Der Unterprozess sieht keine Eingabe, bis Sie die Eingabetaste drücken. Emacs verhält sich wie ein dummes Terminal. Es werden zwar Farbcodes unterstützt, aber keine Dinge wie das Bewegen des Cursors, sodass Sie keine Anwendungen ausführen können, die auf Flüchen basieren.

termist ein Terminalemulator, der in Emacs Lisp geschrieben wurde. In diesem Modus werden die von Ihnen gedrückten Tasten direkt an den Unterprozess gesendet. Sie verwenden die von der Shell angebotenen Funktionen zur Zeilenbearbeitung, nicht die von Emacs. Sie können damit auch Programme ausführen, die erweiterte Terminalfunktionen wie die Cursorbewegung verwenden (z. B. Sie könnten Emacs ausführen nanooder lessin Emacs).

eshellist eine Shell, die direkt in Emacs Lisp implementiert ist. Sie führen keine bashoder eine andere Shell als Unterprozess aus. Infolgedessen stimmt die Syntax nicht mit der von bashoder überein sh. Es ermöglicht Dinge wie die Umleitung der Ausgabe eines Prozesses direkt in einen Emacs-Puffer (try echo hello >#<buffer results>).

cjm
quelle
19

Laut Xahlee-Seite :

shell ist die Standard-Emacs-Schnittstelle zur Befehlszeilenschnittstelle des Betriebssystems.

term(ansi-term ist heute ziemlich gleich zu term. Es waren verschiedene Pakete, aber jetzt sind beide in term.el definiert.) ist ein Terminal-Emulator. Es verhält sich wie eine dedizierte Terminal-App wie {xterm, gnome-terminal, puTTY}. Es ist mit mehr Shell-Apps als der Emacs-Shell-Oberfläche kompatibel, aber Standard-Emacs-Tasten wie das Bewegen des Cursors funktionieren hier nicht (weil es ein Terminal emuliert).

eshellist eine Shell, die komplett in Emacs Lisp geschrieben ist. Hinweis: Es ist kein Bash-Emulator. Eshell ist eine Muschel für sich, aber ähnlich wie Bash oder andere Muscheln.

Welches solltest du verwenden?

Es hängt von Ihrer Präferenz ab.

shell eignet sich für die allgemeine Verwendung von klassischen / standardmäßigen Unix-Shell-Befehlen wie {grep, du, ls, sort, cat, head, tail, uname,…}.

term & ansi-term sind gut, wenn Sie Dinge wie ssh oder eine andere interaktive Befehlszeilenschnittstelle (wie {python, ruby, lisp} shell) oder eine textbasierte GUI-App wie {vim, synaptic,…} ausführen möchten.

eshell ist besonders unter Microsoft Windows gut, wo bash nicht installiert ist, oder wenn Sie ein Emacs Lisp-Programmierer sind, weil eshell direkten Zugriff auf Emacs Lisp hat.

CodyChan
quelle
Alle von Ihnen erwähnten Befehle (grep, du, ls usw.) sind Programme und Befehle, die in der Shell erstellt wurden. eshellwerden sie auch haben, wenn Sie diese Programme installiert haben.
Bart Louwers
1
@Bart versuchen, Ihr grep in Ihrem System zu entfernen und grep in eshell auszuführen. Sie werden feststellen, dass das grep in eshell nicht grep in Ihrem System ist. which grepIn eshll wird "eshell / grep ist eine" kompilierte Lisp-Funktion in unix.el ', natürlich kann das grep in deinem System in eshell ausgeführt werden, wie ich schon sagte, eshell ist sehr nützlich in MS, wo viele kleine Tools wie grep nicht installiert sind.
CodyChan