1 什么是Eshell?
Eshell是Emacs完全用Elisp实现的类UNIX shell. 由于它完全是由Elisp实现的,因此它具有与Emacs相同的可移植性,而且它可以很自然的与Elisp代码相结合. 事实上,你完全可以在Eshell下运行lisp代码
2 Eshell与普通shell有什么不同?
Eshell支持输出重定向但不支持输入重定向
Eshell没有job control功能,它不支持多进程的后台切换
Eshell没办法输入C-z,因为C-z会被emacs所捕获.
Eshell可以识别更多类型的参数
字符串
数字
Lisp列表
Lisp符号
Emacs buffer
Emacs process handles
Eshell类似于unix的shell,因此若你是在windows下运行Eshell,你会发现像dir,copy这一类cmd.exe执的内置命令无法使用了,取而代之的是ls,cp这一类的unix命令
Eshell并不直接调用exec这样的内核函数,它把输入的命令转换成一个可执行的Lisp代码形式,然后执行这段代码.
要查看输入的命令被转成什么样的Lisp代码,可以输入`eshell-parse-command "echo hello"`
Eshell的多开比较复杂,若你已经打开了一个Eshell,再允许M-x eshell,只会跳转到那个eshell而已. 解决的办法有:
先用rename-buffer把打开的那个*eshell* buffer重命名为其他命令,再调用M-x eshell
使用C-u 数字n M-x eshell会创建一个编号为n的的eshell窗口
3 命令
3.1 命令提示符
你可以通过变量`eshll-prompt-function`自定义eshell的命令提示符. 该变量可以是一个匿名函数或一个函数名称,该函数的返回值被显示为Eshell的命令提示符号.
当你改了自己的命令提示符后,为了让Eshell能够识别出一行输出的那个部分是命令提示符,你还需要冲定义变量`eshll-prompt-regexp`,符合该正则的部分被识别为命令提示符
3.2 Eshell中查找命令的顺序为(以cp命令为例)
输入的是完整路径(/bin/cp),则直接调用该路径的命令
查询命令前缀,若为*(由变量`eshell-explicit-command-char`决定),并且能够在search path中查找到命令,则执行查找到的命令
查询定义的alias
在search path,$PATH中查询该命令
查询同名的Lisp函数cp或eshell定义的命令eshell/cp
但若变量`eshell-prefer-lisp-functions`设置为t,则会最优先搜索elisp函数和eshell定义的命令.
你可以用which命令来查看命令的指向. 例如
~ $ which ls eshell/ls is a compiled Lisp function in `em-ls.el'
如果你想调用外部的同名命令,可以在命令前加星号*. 例如
~ $ which *ls /bin/ls
3.3 内置命令
eshell自己实现了许多的内置命令,例如ls. 但通常这些内置命令只是实现了最常用的那些功能. 但是Eshell足够聪明,当你输入了一个内部命令不支持的参数时,eshell会自动调用外部命令来执行
大多数的eshell内置命令都提供–help选项,输出帮助信息
addpath 路径/路径列表
把路径加入到PATH环境变量中,如果不加参数,则输出当前的PATH变量值
<