Emacs中的shell,eshell和term有什么区别?


60

在Emacs中,我可以使用以下命令运行外壳程序-

M-x term

M-x shell

M-x eshell

这三个之间有什么区别?

Answers:


61

shell是这3个选择中最古老的。它使用Emacs comint-mode来运行子外壳(例如bash)。在这种模式下,您正在使用Emacs编辑命令行。直到您按Enter键,子流程才会看到任何输入。Emacs的行为就像一个愚蠢的终端。它确实支持颜色代码,但是不支持移动光标,因此您不能运行基于curses的应用程序。

term是用Emacs Lisp编写的终端模拟器。在这种模式下,您所按的键将直接发送到子流程。您正在使用外壳提供的任何行编辑功能,而不是Emacs的功能。它还允许您运行使用高级终端功能(如光标移动)的程序(例如,您可以在Emacs中运行nanoless在Emacs中运行)。

eshell是直接在Emacs Lisp中实现的shell。您没有在运行bash或将任何其他Shell作为子进程。结果,语法与bash或不太相同sh。它允许诸如将进程的输出直接重定向到Emacs缓冲区(try echo hello >#<buffer results>)之类的事情。


19

根据Xahlee页面

shell 是操作系统命令行界面的标准emacs界面。

term(ansi-term与今天的term几乎相同。它们是不同的程序包,但现在都在term.el中定义)是终端仿真器。它的行为就像一个专用的终端应用程序,例如{xterm,gnome-terminal,puTTY}。它比emacs shell界面兼容更多的shell应用程序,但是标准的emacs键(例如,移动光标)在这里不起作用(因为它是在模拟终端。)

eshell是完全用emacs lisp编写的shell。注意:它不是bash模拟器。Eshell本身就是一个外壳,但类似于bash或其他外壳。

您应该使用哪个?

这取决于您的喜好。

shell 非常适合经典/标准unix shell命令的常规使用,例如{grep,du,ls,sort,cat,head,tail,uname,…}。

term & ansi-term 如果您想运行ssh之类的东西或其他命令行交互界面(例如{python,ruby,lisp} shell)或基于文本的GUI应用程序(例如{vim,synaptic等),则非常有用。

eshell 尤其适用于未安装bash的Microsoft Windows,或者如果您是emacs lisp编程器,则因为eshell可以直接访问emacs lisp。


您提到的所有命令(grep,du,ls等)都是内置在shell中的程序和命令。eshell如果您已经安装了这些程序,它们也将具有它们。
巴特·卢维尔

1
@Bart尝试删除系统中的grep并在eshell中执行grep操作,您会发现eshell中的grep不是系统中的grep,which grep在eshll中说“ eshell / grep是`em-中的Lisp编译函数” unix.el',因为您系统中的grep可以在eshell中执行,就像我说过的,eshell在MS中非常有用,因为MS中没有安装很多小工具,例如grep。
CodyChan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.