Linux: nhắc nhở bash màu sẽ phá vỡ trở lại vận chuyển


24

Khi tôi cố gắng tô màu bashlời nhắc như thế này:

export PS1="\e[0;31m[\u@\h \W]\$ \e[m "

nó phá vỡ trở lại vận chuyển (thay vì đi đến một dòng mới khi dòng đầy, nó bắt đầu trong cùng một dòng và xóa văn bản đầu vào).

Nếu tôi loại bỏ chuỗi màu, nó hoạt động tốt.
Tôi sử dụng Ubuntu 11.10 và thiết bị đầu cuối (guake cũng có lỗi tương tự).


Lạ thật. Nó hoạt động với bất kỳ vấn đề nào trên RedHat 5 và Mac OS X
Matteo

có thể trùng lặp vấn đề PS1, cmd đang lặp
grawity

Câu trả lời:


43

Bạn phải bọc tất cả các chuỗi thoát giữa \[\]để 'đường dẫn' để tính toán chính xác độ dài hiển thị của dấu nhắc. Không có chúng, 'readline' nghĩ rằng lời nhắc dài hơn nó và không biết khi nào văn bản đạt đến lề.

PS1 = " \ [ \ e [; 31m \] [\ u @ \ h \ W] \ $ \ [ \ e [m \] "

4
Cảm ơn rất nhiều !! tôi đã cố gắng tìm một số tài liệu về nó trong các tài liệu chính thức nhưng không thể - dấu nhắc màu 'stock' sử dụng 'mẹo' này và tôi đã gặp khó khăn khi lần đầu tiên tìm ra chính xác nó là gì, vì vậy cảm ơn vì đã xóa nó lên --- btw tôi thực sự đã tìm thấy nguồn tài liệu trong 'man readline 3' xung quanh dòng 684 và nó nói rằng đây thực sự được gọi là 'Skip-csi-Sequ' cho những ai muốn biết tài liệu về vấn đề này ở đâu. Tôi không nghĩ rằng tôi sẽ tìm thấy nó mà không cần bạn chỉ cho tôi đọc (3) mặc dù tôi đã biết về nó trước đây - không thể thực hiện kết nối.
osirisgothra

"Bọc" nghĩa là gì? Bạn có nghĩa là quấn toàn bộ điều TRÊN một \[, \]? Tôi đoán vậy, nhưng nó dường như không làm việc cho tôi.
Max Howell

2
@osirisgothra: Tài liệu thực sự đang nói về một điều khác - skip-csi-sequencecó nghĩa là để ngăn chặn các chuỗi đầu vào được tạo bởi các khóa đặc biệt.
grawity

1
@MaxHowell bạn phải bọc từng \e[xxmchuỗi chứ không phải toàn bộ chuỗi.
Enrico

Cảm ơn. Trong trường hợp của tôi, tôi chỉ thay thế \e[39mvới \[\e[;39m\]và nó hoạt động tốt
Herrgott

1

mẹo [và] cũng hoạt động trên bash trên OS X 10.8.2.

Tôi sử dụng:

PS1 = "[\ e [0; 37m \ W \ $ (git nhánh 2> / dev / null | grep -e '*' | sed 's / ^ .. (. *) / {\ 1} /') \ $ \ e [m] "

trong đó cho tôi thấy chi nhánh git hiện tại của tôi đang sử dụng.


Bạn có biết về "__git_ps1" không?
rafak

dây thừng. điều kỳ diệu nó sẽ làm gì?
Stonefruit
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.