Comment le mode shell d'emacs sait-il inviter sudo?

17

Dans shell-mode, une commande comme sudo CMDouvre une invite dans la zone d'écho disant:

[sudo] password for root: 

Comment sait-il cela? AFAIK, ce comportement ne peut pas découler d'un simple fonctionnement sudocomme d'habitude, car le programme readintégré ne crée pas une telle invite.

extremeaxe5
la source

Réponses:

22

Cela se fait via un filtre de processus.

Par défaut, comint-output-filter-functionsinclut comint-watch-for-password-prompt, qui est la fonction de filtre qui gère cela.

S'il voit la correspondance de texte, comint-password-prompt-regexpil appelle send-invisiblepour demander à l'utilisateur un mot de passe.

Pour plus d'informations sur le fonctionnement des filtres de processus, reportez-vous à C-hig (elisp)Filter Functions


Modifier: À titre de suivi, notez également que vous pouvez M-x toggle-debug-on-quit, puis à l'invite sudo, tapez C-gpour obtenir une trace qui montrerait ce qui se passe. par exemple:

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 sortie est minime en raison de l'évaluation du code compilé en octets, donc le détail de comint-output-filter-functionsest perdu, mais vous pouvez toujours voir immédiatement la situation générale. Vous pouvez également M-x load-library RET comint.el RETcharger le code non compilé, puis répéter tout le processus pour obtenir une trace plus détaillée.

phils
la source
Grande astuce de débogage!
clemera