ในshell-mode
คำสั่งเช่นsudo CMD
เปิดพรอมต์ในพื้นที่ echo ว่า:
[sudo] password for root:
มันจะรู้ได้อย่างไรว่าจะทำเช่นนี้? AFAIK พฤติกรรมนี้ไม่สามารถวิ่งออกมาได้ง่ายsudo
เหมือนปกติเพราะread
builtin ไม่ได้สร้างพรอมต์ดังกล่าว
ในshell-mode
คำสั่งเช่นsudo CMD
เปิดพรอมต์ในพื้นที่ echo ว่า:
[sudo] password for root:
มันจะรู้ได้อย่างไรว่าจะทำเช่นนี้? AFAIK พฤติกรรมนี้ไม่สามารถวิ่งออกมาได้ง่ายsudo
เหมือนปกติเพราะread
builtin ไม่ได้สร้างพรอมต์ดังกล่าว
คำตอบ:
สิ่งนี้ทำผ่านตัวกรองกระบวนการ
โดยค่าเริ่มต้น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เพื่อรับ backtrace ซึ่งจะแสดงสิ่งที่เกิดขึ้น เช่น:
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โหลดรหัสที่ไม่ได้คอมไพล์แล้วทำซ้ำกระบวนการทั้งหมดเพื่อรับ backtrace ที่มีรายละเอียดมากขึ้น