emacs的“ shell-mode”如何知道提示输入sudo?


17

在中shell-mode,类似sudo CMD的命令会在回显区域中打开一个提示符,提示:

[sudo] password for root: 

它怎么知道要这样做?AFAIK,这种行为不能摆脱sudo像平常一样简单运行的原因,因为read内置函数不会创建这样的提示。

Answers:


22

这是通过过程过滤器完成的。

默认情况下comint-output-filter-functions包含comint-watch-for-password-prompt,这是处理此问题的过滤器功能。

如果看到文本匹配,comint-password-prompt-regexp则调用send-invisible提示用户输入密码。

有关流程过滤器如何工作的更多信息,请参阅 C-hig (elisp)Filter Functions


编辑:作为后续,还请注意,您可以M-x toggle-debug-on-quit然后在sudo提示符下键入C-gbacktrace,以显示正在发生的事情。例如:

Debugger entered--Lisp error: (quit)
  read-string("[sudo] password for <username>: " nil t nil)
  read-passwd("[sudo] password for <username>: ")
  send-invisible("[sudo] password for <username>: ")
  comint-watch-for-password-prompt("[sudo] password for <username>: ")
  run-hook-with-args(comint-watch-for-password-prompt "[sudo] password for <username>: ")
  comint-output-filter(#<process shell> "[sudo] password for <username>: ")

由于正在评估字节编译的代码,因此输出很少,因此comint-output-filter-functions丢失了详细信息,但是您仍然可以立即看到一般情况。您还M-x load-library RET comint.el RET可以加载未编译的代码,然后重复整个过程以获得更详细的回溯。


很棒的调试提示!
clemera
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.