En Emacs puedo ejecutar un shell usando los siguientes comandos:
M-x term
M-x shell
M-x eshell
¿Cuál es la diferencia entre estos tres?
shell
es la más antigua de estas 3 opciones. Utiliza Emacs comint-mode
para ejecutar una subshell (por ejemplo bash
). En este modo, está utilizando Emacs para editar una línea de comando. El subproceso no ve ninguna entrada hasta que presiona Enter. Emacs está actuando como una terminal tonta. Admite códigos de color, pero no cosas como mover el cursor, por lo que no puede ejecutar aplicaciones basadas en maldiciones.
term
es un emulador de terminal escrito en Emacs Lisp. En este modo, las teclas que presiona se envían directamente al subproceso; está utilizando las capacidades de edición de línea que presenta el shell, no las de Emacs. También le permite ejecutar programas que utilizan capacidades avanzadas de terminal como el movimiento del cursor (por ejemplo, podría ejecutar nano
o less
dentro de Emacs).
eshell
es un shell implementado directamente en Emacs Lisp. No está ejecutando bash
ni ningún otro shell como subproceso. Como resultado, la sintaxis no es exactamente la misma que bash
o sh
. Permite cosas como redirigir la salida de un proceso directamente a un búfer de Emacs (probar echo hello >#<buffer results>
).
Según la página de Xahlee :
shell
es la interfaz estándar de emacs para la interfaz de línea de comandos del sistema operativo.
term
(ansi-term es más o menos igual que el término de hoy. Eran paquetes diferentes, pero ahora ambos definidos en term.el) es un emulador de terminal. Se comporta como una aplicación de terminal dedicada, como {xterm, gnome-terminal, puTTY}. Es compatible con más aplicaciones de shell que la interfaz de shell de emacs, pero las teclas estándar de emacs, como el cursor en movimiento, no funcionan aquí (porque está emulando un terminal).
eshell
es un shell escrito completamente en emacs lisp. Nota: no es un emulador de bash. Eshell es un shell en sí mismo, pero similar a bash u otros shells.
¿Cuál deberías usar?
Eso depende de tu preferencia.
shell
es bueno para el uso general de los comandos de shell de Unix clásicos / estándar, como {grep, du, ls, sort, cat, head, tail, uname, ...}.
term & ansi-term
son buenos si desea ejecutar cosas como ssh u otra interfaz interactiva de línea de comandos (como {python, ruby, lisp} shell) o una aplicación GUI basada en texto como {vim, synaptic, ...}.
eshell
es bueno especialmente en Microsoft Windows donde bash no está instalado o, si es un programador de emacs lisp, porque eshell tiene acceso directo a emacs lisp.
eshell
los tendrá también si tiene esos programas instalados.which grep
en eshll dice "eshell / grep es una" función Lisp compilada en `em- unix.el ', porque el grep en su sistema se puede ejecutar en eshell, como dije eshell es muy útil en MS que muchas herramientas pequeñas como grep no están instaladas.