Pregunta:
En shell-mode
, un comando como sudo CMD
abre un mensaje en el área de eco que dice:
[sudo] password for root:
¿Cómo sabe hacer esto? AFAIK, este comportamiento no puede surgir simplemente de ejecutar sudo
como de costumbre, porque la read
incorporada no crea tal mensaje.
Respuesta:
Esto se realiza mediante un filtro de proceso.
Por defecto, comint-output-filter-functions
incluye comint-watch-for-password-prompt
, que es la función de filtro que maneja esto.
Si ve texto que coincide con comint-password-prompt-regexp
entonces llama a send-invisible
para solicitar al usuario una contraseña.
Para obtener más información acerca de cómo funcionan los filtros proceso, consulte CH I g (elisp)Filter Functions
Editar: como seguimiento, tenga en cuenta también que puede Mx toggle-debug-on-quit
y luego, en el indicador de sudo, escriba Cg para obtener un seguimiento que mostrará lo que está sucediendo. p.ej:
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>: ")
La salida es mínima debido al código compilado por bytes que se está evaluando, por lo que se comint-output-filter-functions
el detalle de las comint-output-filter-functions
de comint-output-filter-functions
de comint-output-filter-functions
, pero aún puede ver inmediatamente la situación general. También puede Mx load-library
RET comint.el
RET para cargar el código no compilado y luego repetir todo el proceso para obtener un rastreo más detallado.