Answers:
首先检查在您的eshell会话中执行了哪个sudo。可能是系统的sudo:
$ which sudo
/path/to/system/wide/sudo
$ which *sudo
/path/to/system/wide/sudo
或eshell的sudo:
$ which sudo
sudo is a compiled Lisp function in `em-tramp.el'
$ which eshell/sudo
eshell/sudo is a compiled Lisp function in `em-tramp.el'
Eshell的sudo使用TRAMP的su或sudo方法。这些命令位于eshell-tramp模块中,该模块默认情况下处于禁用状态。
我将介绍eshell的sudo情况,因为它在Emacs内部,并且不依赖于您的操作系统发行版:
加载eshell-tramp模块:
(require 'em-tramp) ; to load eshell’s sudo
切换到eshell的sudo
通过首选内置命令
(setq eshell-prefer-lisp-functions t)
似乎在Emacs 24.4中,我们需要设置
(setq eshell-prefer-lisp-variables t)
通过创建别名(在eshell中执行代码段)
alias sudo 'eshell/sudo $*'
由alias命令定义(或删除)的别名会自动写入由eshell-aliases-file命名的文件中,您也可以直接对其进行编辑(尽管您必须手动重新加载它)。
最后,为eshell的sudo(和TRAMP)启用密码缓存:
(setq password-cache t) ; enable password caching
(setq password-cache-expiry 3600) ; for one hour (time in secs)
PS如果您已使用eshell-prompt-function更改了提示,请记住相应地调整提示正则表达式eshell-prompt-regexp。错误的提示正则表达式会破坏某些eshell功能-包括密码检测。
/usr/bin/sudo
无法正常工作(尽管我使用的是Emacs 25.0.50.1)
which sudo
仍显示/usr/bin/sudo
在我的系统上。