ปัญหาของ PS1 ทำให้ CLI เกิดความสับสน


16

ฉันทำงาน PS1 อย่างง่าย

PS1="\e[0;31m[\W]\$ \e[m "

สิ่งที่ฉันต้องการทำคือการเปลี่ยนสีของพรอมต์และแสดงเฉพาะเส้นทางสัมพัทธ์ อย่างไรก็ตามสิ่งนี้จะทำให้ CLI เสีย ตัวอย่างเช่นเมื่อเรียกดูประวัติของมันจะครอบตัดและทับจอแสดงผล เมื่อฉันพิมพ์คำสั่งแบบยาวเคอร์เซอร์จะเลื่อนไปที่จุดเริ่มต้นของหน้าจอซ้อนทับพร้อมกับแสดงพรอมต์ของตัวเอง ฉันทำอะไรผิด

คำตอบ:


30

นั่นเป็นเพราะทุบตีคิดว่าพรอมต์ยาวกว่านั้น \e[0;31mยกตัวอย่างเช่นลำดับการหลบหนีถูกดูดโดยสถานีซึ่งจะเปลี่ยนข้อความดังต่อไปนี้สีแดง แต่ทุบตีไม่ทราบว่า ดังนั้นคุณต้องบอกให้ทุบตีว่าลำดับของตัวละครนั้นไม่ควรนับในความยาวของพรอมต์และคุณก็ทำได้โดยใส่มัน\[ \]ไว้ ฉันยังแนะนำให้ใช้ tput แทน hardcoding terminal escape sequences

red=$(tput setaf 1)
reset=$(tput sgr0)
PS1='\[$red\][\W]\$\[$reset\] '

ดูBashFAQ 53และรหัสร์มินัล (ANSI / VT100) แนะนำเพิ่มเติม


1
ขอบคุณสำหรับคำอธิบายที่สมบูรณ์แบบของคุณฉันมีปัญหานี้หลายครั้งและไม่เคยรู้ว่าปัญหาอยู่ที่ไหน
Betlista

+1 เหมือนกันที่นี่ สำหรับผู้สุ่มสี่สุ่มห้าทดสอบและแก้ปัญหานี้ก็ไม่ได้ทำงานมันนี่มูลค่าการกล่าวขวัญว่ามีไวยากรณ์อื่นที่อธิบายไว้ในลิงค์ BashFAQ \001 \002หนีสีภายในฟังก์ชั่น
Stephen Niedzielski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.