Tại sao dấu nhắc bash này đôi khi giữ một phần của các lệnh trước đó khi cuộn lịch sử?


29

Dấu nhắc bash của tôi, mà tôi thừa nhận đã bị đánh cắp từ một vài nơi và được ghép lại với nhau, đôi khi sẽ thêm một phần của các lệnh trước đó vào chiều dài của nó khi cuộn lịch sử bash bằng mũi tên lên / xuống.

Ví dụ: nếu các lệnh trước của tôi là:

ls
cd /home/caleb
vim .bashrc

Khi tôi ở dấu nhắc của mình và cuộn lên hai lần, nó có thể trông như sau:

$ vim .bcd / nhà / caleb

Trường hợp năm ký tự đầu tiên còn lại từ lệnh cuối cùng.

Có ai có bất kỳ ý tưởng tại sao điều này đang xảy ra, và làm thế nào nó có thể được dừng lại?

Lời nhắc của tôi được đặt với mã này (cách để bao gồm ở đây): https://gist.github.com/1679352


1
Đặt PS1 thành một giá trị mà không có toàn bộ vcs crap và xem điều gì sẽ xảy ra. Đó là dự đoán của tôi.
Daniel Beck

Bạn đã tìm ra thủ phạm trong lời nhắc của mình chưa? Tôi có cùng một vấn đề.
acme

Yeah bash làm mất nó trên các màu và không thể tách rời độ dài của chuỗi với màu thoát ra khỏi độ dài của chuỗi có thể nhìn thấy. Đây là những gì SiegeX đã nhận được. Tôi đã kết thúc việc chuyển sang ZSH và sử dụng một dấu nhắc khác. ZSH không có cùng một vấn đề.
Caleb Thompson

1
Cả hai câu trả lời trước đều không giải quyết được vấn đề của tôi và không đưa ra bất kỳ lời giải thích nào tại sao điều này xảy ra. Vui lòng kiểm tra nhắc nhở Bash tùy chỉnh là ghi đè chính nó , nếu bất cứ ai có tìm kiếm đến thời điểm này.
D3Hunter

Câu trả lời:


6

Đâu đó lời nhắc của bạn là fubar. Điều thường xảy ra là shell của bạn nghĩ rằng nó xuất ra các mã hạn không thể in được và hy vọng nó sẽ chiếm dung lượng. Lời khuyên tốt nhất tôi có thể cung cấp cho bạn là thêm một cách có hệ thống vào (hoặc lấy đi) lời nhắc của bạn cho đến khi hành vi này dừng lại để cô lập mã gây ra vấn đề này.


37

Các mã màu cần phải được bọc trong dấu ngoặc vuông. Dấu ngoặc thông báo bash rằng văn bản kèm theo không nên được in

dựa trên ví dụ của @ Phreditor, điều này cho thấy mọi định dạng được thực hiện sau dòng mới sẽ dẫn đến vấn đề ban đầu:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\033[0;90m\$ "

gói mã định dạng trong [] đảm bảo rằng hành vi gây phiền nhiễu không bao giờ xảy ra:

export PS1="\n\[\[\033[01;33m\][\w]\[\033[00m\]\n\[\033[0;90m\]\$ "

Tài liệu: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.html

Vì định dạng PS1 khiến giá trị quá dài và khó đọc, tôi đặt mã định dạng vào các biến:

BYELLOW='\[\033[01;33m\]'
IBLACK='\[\033[0;90m\]'
PS_CLEAR='\[\033[0m\]'
export PS1="\n${BYELLOW}[\w]${PS_CLEAR}\n${IBLACK}\$ "

3
Đây phải là câu trả lời được chấp nhận. Đã giải quyết vấn đề.
Đã kết thúc vào

1
Cần lưu ý (vì tôi không lưu ý đến nó;)), rằng trong mớ hỗn độn dấu gạch chéo ngược và dấu ngoặc vuông, dấu ngoặc vuông tuân theo trình tự thoát \033sẽ KHÔNG được thoát. Chỉ có dấu ngoặc vuông được thoát.
Stewam

Cách gây nhầm lẫn cho tôi để đối phó với tất cả các ký tự đặc biệt đó, sử dụng kết quả google đầu tiên đã giúp tạo ra một dấu nhắc làm việc chính xác như tôi muốn: ezprompt.net
Mallox

Tôi đã muốn tùy chỉnh màu sắc nhanh chóng của mình cho NĂM nhưng không bao giờ có vì tôi luôn gặp phải vấn đề này! Tôi không bao giờ có thể hiểu tại sao vì vậy tôi chỉ dừng lại và giữ mọi thứ trắng ... Tôi vừa thiết lập một máy tính mới và cuối cùng tôi đã nhận ra vấn đề thực sự của Google một lần ... Tôi rất vui vì tôi đã làm vậy! Cảm ơn bạn cho bài học tuyệt vời này.
TylerH4

8

Tôi đã có cùng một vấn đề và nó có liên quan đến các định nghĩa màu sắc.

Trong trường hợp của tôi, tôi có một dấu nhắc nhiều dòng (cung cấp hầu hết không gian cho lệnh hiện tại bất kể độ dài đường dẫn được hiển thị bởi dấu nhắc).

Phiên bản xấu:

export PS1="\n\n\[\033[01;33m[\w]\n\033[00m\$ "

Phiên bản tốt:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\$ "

\033[00mchấm dứt màu sắc. Nếu nằm sau dòng mới ( \n), nó sẽ ngăn việc vẽ lại thích hợp trong thiết bị đầu cuối, để ghi đè các lệnh trước đó bằng màu nền. Di chuyển nó phía sau dòng mới giải quyết vấn đề.

(sử dụng Terminal trong Mac OS 10.8)


Điều này xác định chính xác vấn đề cho tôi, trong khi câu trả lời được chấp nhận hiện tại quá chung chung.
Brian

Đây là câu trả lời chính xác hơn và nên là người chiến thắng (và cũng là giải pháp cho vấn đề của tôi).
craveytrain

đó \ncũng là thủ phạm đối với tôi Cảm ơn!
mhulse

3

Tôi thực sự nghĩ rằng điều này có liên quan đến một dấu phân cách 'ký tự không in' bị thiếu. Tôi đã có chính xác vấn đề tương tự, nhưng di chuyển nó trước dòng mới (\ n) đã không khắc phục nó. Thay vào đó, tôi bao quanh chính xác tất cả các ký tự không in (ở đây, tô màu các lệnh) bằng '\ [' và '\]'.

Xấu (hoạt động, nhưng có vấn đề về lịch sử được mô tả ở trên):

PS1="\e[32m\u\e[35m@\e[32m\h \e[33m\w\e[36m\n\$\e[0m"

Tốt (bao quanh tất cả các lệnh màu với '\ [' và '\]' - không hiển thị lịch sử lệnh đã trộn):

PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"

i.e. "\e[...m" --becomes--> "\[\e[...m\]"

Và nếu bạn đang đặt cái này vào một cái gì đó như SecureCRT để tự động gửi khi đăng nhập vào hệ thống, bạn có thể phải thoát gấp đôi mọi thứ (đặt dấu gạch chéo kép ở mọi nơi) nếu hệ thống đăng nhập tự động sử dụng dấu gạch chéo đầu tiên để xác định ký tự được gửi :

PS1="\\[\\e[32m\\]\\u\\[\\e[35m\\]@\\[\\e[32m\\]\\h \\[\\e[33m\\]\\w\\[\\e[36m\\]\\n\\$\\[\\e[0m\\]"

i.e. "\..." --becomes--> "\\..."

(Điều này hoàn toàn đúng với SecureCRT và có thể đúng với những người khác, chẳng hạn như PuTTY hoặc TeraTerm - yêu cầu thử nghiệm từ phía bạn.)

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.