emacs `shell-mode`はsudoのプロンプトをどのように知るのですか?


17

ではshell-mode、次のようなコマンドをsudo CMD言ってエコー領域にプロンプトを開きます:

[sudo] password for root: 

これを行う方法はどのようにわかりますか?私の知る限り、ビルトインはそのようなプロンプトを作成しないsudoので、この動作は通常のように単純に実行することから立ち上がることはできませんread

回答:


22

これは、プロセスフィルターを介して行われます。

デフォルトでcomint-output-filter-functionscomint-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、コンパイルされていないコードをロードし、プロセス全体を繰り返して、より詳細なバックトレースを取得することもできます。


すばらしいデバッグのヒント!
クレメラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.