Neden bu bash bilgi istemi geçmişi kaydırırken bazen önceki komutların bir kısmını saklıyor?


29

Birkaç yerden çalındığını ve birlikte kaldırıldığını itiraf ettiğim bash istemim, bash tarihini yukarı / aşağı oklarla kaydırırken bazen önceki komutların bir kısmını uzunluğuna ekler.

Örneğin, önceki komutlarım:

ls
cd /home/caleb
vim .bashrc

Ben istekte bulunduğumda ve iki kez yukarı kaydırdığımda şöyle görünebilir:

$ vim .bcd / home / caleb

İlk beş karakterin son komuttan sonra bırakıldığı yer.

Bunun neden olduğu ve nasıl durdurabileceği hakkında bir fikri olan var mı?

İsteğim bu kodla ayarlandı (buraya eklenecek kadar uzun): https://gist.github.com/1679352


1
PS1'i tüm vcs desteği olmadan bir değere ayarlayın ve ne olduğunu görün. Bu benim tahminim.
Daniel Beck

Suçluyu isteğinizde buldunuz mu? Aynı sorunu yaşıyorum.
acme

Evet bash renkleri kaybeder ve renk kaçışlarıyla dizelerin uzunluğunu görünür dizginin uzunluğundan ayıramaz. SiegeX'in aldığı şey buydu. ZSH'ye geçip farklı bir bilgi istemi kullandım. ZSH aynı sorunu yok.
Caleb Thompson,

1
Her iki önceki cevap sorunumu çözemedi ve bunun neden olduğunu açıklayamadı. Lütfen bu noktada arama yapanlar varsa Özel Bash isteminin kendi üzerine yazdığını kontrol edin .
D3Hunter

Yanıtlar:


6

Bir yerde senin emrin fubar. Genelde olan şey, kabuğunuzun yazdırılamayan terim kodları çıkardığını ve yer kaplamasını beklediğini düşünmesidir. Size verebileceğim en iyi tavsiye, bu davranış bu soruna neden olan kodu izole etmeyi bırakana kadar isteminize sistematik olarak eklemek veya almaktır.


37

Renk kodlarının köşeli parantez içine alınması gerekir. Köşeli ayraçlar, ekteki metnin yazdırılmaması gerektiğini açıkça belirtir.

@ Phreditor örneğine dayanarak, bu, yeni satırdan sonra yapılan herhangi bir biçimlendirmenin asıl sayıya yol açacağını gösterir:

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

biçim kodunu [] içine kaydırmak sinir bozucu davranışların asla gerçekleşmemesini sağlar:

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

Belgeler: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.html

PS1 formatlama, değerin çok uzun ve okunması zor olduğundan, format kodlarını değişkenlere koyarım:

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

3
Bu kabul edilen cevap olmalı. Sorunu çözdü.
Atcold

1
Not edilmelidir (çünkü bunu not etmedim;)), ters eğik çizgi ve köşeli parantezlerin dağılmasında, kaçış sırasını izleyen köşeli parantezlerin kaçmaması \033gerektiği unutulmamalıdır. Sadece sarma köşeli parantezler çıkarılmalıdır.
18'de 16

Tüm bu özel karakterlerle başa çıkmak için kafa karıştırmamın yolu, ilk google sonucunu kullanmak, tam olarak istediğim gibi bir çalışma istemi oluşturmamıza yardımcı oldu: ezprompt.net
Mallox

İstemi renklerimi YILLAR için özelleştirmek istiyordum ancak bu konuyu her zaman yaşadığımdan beri de olmadı! Nedenini tam olarak anlayamadım, bu yüzden her şeyi durdurdum ve her şeyi beyaz tuttum ... Yeni bir bilgisayar kuruyordum ve sonunda Google’ın sorununun bir kez olduğunu anlayabildim ... Çok sevindim! Bu harika ders için teşekkür ederim.
TylerH4

8

Aynı sorunu yaşadım ve renk tanımlarıyla ilgiliydi.

Benim durumumda çok satırlı bir bilgi istemim var (bilgi istemi tarafından gösterilen yol uzunluğuna bakılmaksızın mevcut komut için çoğu alana yer verir).

Kötü sürüm:

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

İyi sürüm:

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

\033[00mRengi sonlandırır. Yeni satırın ( \n) peşindeyse, önceki komutların üzerine arka plan renginin üzerine yazmak için terminalde yeniden çizilmeyi önler. Sorunu yeni çizginin arkasına taşımak sorunu çözdü.

(Mac OS 10.8’de Terminal kullanılarak)


Bu benim için konuyu işaret ederken, mevcut kabul edilen cevap çok geneldi.
Brian

Bu daha kesin cevap ve kazanan olmalı (ve benim sorunumun da çözümü idi).
craveytrain

\nBana da suçlu idi. Teşekkürler!
mhulse

3

Aslında bunun eksik bir 'basılmayan karakter' sınırlayıcısıyla ilgili olduğunu düşünüyorum. Ben de aynı sorunu yaşadım, ancak yeni satır (\ n) 'nın önüne geçmeden sorunu taşımak. Bunun yerine, baskı yapmayan tüm karakterleri (burada, renklendirme komutlarını) '\ [' ve '\]' ile doğru şekilde sardım.

Kötü (çalışıyor, ancak yukarıda açıklanan tarih ezme sorunu var):

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

İyi (tüm renk komutlarını '\ [' ve '\]' ile sarılı - püresi komut geçmişini göstermez):

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

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

Ve eğer bir sisteme giriş yaptıktan sonra otomatik olarak göndermek için bunu SecureCRT gibi bir şeye koyarsanız, otomatik giriş sistemi gönderilecek karakteri belirlemek için ilk ters eğik çizgiyi kullanırsa, her şeyden iki kez kaçış (her yere çift ters eğik çizgi koymanız) gerekebilir. :

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

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

(Bu, SecureCRT için kesinlikle geçerlidir ve sizin için gerekli olan PuTTY veya TeraTerm testi gibi diğerleri için de geçerli olabilir.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.