Tonin ชี้ให้เห็นข้อผิดพลาดในของฉันพรอมต์เริ่มต้น ตัวอย่างที่น้อยที่สุด:
ตั้งค่า PS1:
PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " ")$ '
ณ จุดนี้พรอมต์จะมีลักษณะดังนี้:
$
ทริกเกอร์เอาท์พุทรหัสออกจากการทำงาน:
false
ตอนนี้พรอมต์ประกอบด้วยรหัสออกเป็นสีแดงที่จุดเริ่มต้นของบรรทัด:
1 $
- กด-Ctrlr
พิมพ์ "false" ตอนนี้พรอมต์มีเฉพาะการค้นหา:
(reverse-i-search)`false': false
- Enterกด
ประวัติเทอร์มินัลที่ได้รับจะมีสิ่งต่อไปนี้:
1 $ch)`false': false
ผลลัพธ์ที่คาดหวัง:
1 $ false
นั่นคือดูเหมือนว่าเอาต์พุตการค้นหาประวัติจะถูกผสมกับพรอมต์และซ่อนคำสั่งจริงที่ถูกเรียกใช้
ฉันพยายามหลีกเลี่ยงปัญหานี้โดยใช้PROMPT_COMMAND
:
set_exit_code() {
exit_code=$?
[[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " "
}
set_bash_prompt() {
PS1='$(set_exit_code)$ ' # Double quotes give the same result
}
PROMPT_COMMAND=set_bash_prompt
ดูเหมือนจะใช้งานไม่ได้ - บรรทัดนั้นเหมือนกับก่อนหน้าหลังการค้นหาและเรียกใช้
ฉันจะแก้ไขสิ่งนี้ได้อย่างไร