Vấn đề PS1, làm rối CLI


16

Tôi đã làm một bài tập PS1 đơn giản

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

Tất cả những gì tôi muốn làm là thay đổi màu nhắc và chỉ hiển thị đường dẫn tương đối. Tuy nhiên, điều này làm rối tung CLI. Ví dụ, khi duyệt lịch sử với nó cắt và chồng lên màn hình. Khi tôi gõ một lệnh dài, con trỏ sẽ di chuyển đến đầu màn hình trùng với màn hình nhắc nhở. Tôi đã làm gì sai?

Câu trả lời:


30

Đó là bởi vì bash nghĩ rằng dấu nhắc đó dài hơn nó. \e[0;31mVí dụ, chuỗi thoát , bị hút bởi thiết bị đầu cuối, lần lượt biến văn bản sau thành màu đỏ, nhưng bash không biết điều đó. Vì vậy, bạn phải nói với bash rằng chuỗi ký tự đó không được tính vào độ dài của dấu nhắc và bạn làm điều đó bằng cách đặt nó vào trong \[ \]. Tôi cũng khuyên bạn nên sử dụng tput thay vì trình tự thoát khỏi thiết bị đầu cuối hardcoding.

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

Xem phần giới thiệu BashFAQ 53Terminal Terminal (ANSI / VT100) để biết thêm.


1
Cảm ơn mô tả hoàn hảo của bạn, tôi đã gặp vấn đề này nhiều lần và không bao giờ biết vấn đề ở đâu.
Betlista

+1, giống nhau ở đây. Đối với những người mù quáng thử nghiệm giải pháp này và nó không hoạt động, điều đáng nói ở đây là có một cú pháp khác được mô tả trong liên kết BashFAQ để thoát màu trong các hàm , \001 \002.
Stephen Niedzielski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.