¿Cuál es la diferencia entre shell, eshell y term en Emacs?

60

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?

Kshitiz Sharma
fuente

Respuestas:

61

shelles la más antigua de estas 3 opciones. Utiliza Emacs comint-modepara 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.

termes 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 nanoo lessdentro de Emacs).

eshelles un shell implementado directamente en Emacs Lisp. No está ejecutando bashni ningún otro shell como subproceso. Como resultado, la sintaxis no es exactamente la misma que basho sh. Permite cosas como redirigir la salida de un proceso directamente a un búfer de Emacs (probar echo hello >#<buffer results>).

cjm
fuente
19

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).

eshelles 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.

CodyChan
fuente
Todos los comandos que mencionó (grep, du, ls, etc.) son programas y comandos integrados en el shell. eshelllos tendrá también si tiene esos programas instalados.
Bart Louwers
1
@Bart intente eliminar su grep en su sistema y haga la acción grep en eshell, encontrará que grep en eshell no es grep en su sistema, which grepen 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.
CodyChan