Как emacs `shell-mode` знает, что запрашивать sudo?

17

In shell-mode, команда like sudo CMDоткрывает подсказку в эхо-области, говоря:

[sudo] password for root: 

Как он знает, как это сделать? AFAIK, это поведение не может возникнуть из-за простого запуска sudoв обычном режиме, потому что readвстроенная программа не создает такую ​​подсказку.

extremeaxe5
источник

Ответы:

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-gчтобы получить обратный след, который будет показывать, что происходит. например:

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можете загрузить не скомпилированный код, а затем повторить весь процесс, чтобы получить более детальную обратную трассировку.

Phils
источник
Отличный совет по отладке!
Клемера