PS1 için terminal renk kodlarını saklamak için değişkenlerin kullanılması?


33

Benim içinde .bashrc, ben çeşitli bit renklendirmek için ANSI terminali renk kodları kullanın. Bu gibi görünüyor:

PS1='\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ '

stdout öğesinde çıktı veren bash işlevleri burada virtual_envve git_branch.

Şimdi, okumayı ve değiştirmeyi kolaylaştırmak için, renk kodlarını değişkenlere kaydetmek ve doğrudan içine yerleştirmek yerine bunlara başvurmak istiyorum PS1. Böylece bunun gibi bir sürü değişken var:

GREEN="\[\033[32m\]"
YELLOW="\[\033[33m\]"
RESET="\[\033[0m\]"

Gibi bir şey yazabilmek istiyorum:

PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ '

Fakat bu işe yaramıyor - renk kodları, çıktıkları gibi komut isteminde görünüyor. Bunun yerine çift tırnak kullanırsam renkler düzgün çalışır PS1, ancak ardından istemi yalnızca yaptığımda değişir source ~/.bashrc.

Kullanarak - Ben insanların yaptığı gördüğüm başka şeyler denedim printfkoyarak renkler için tek tırnak kullanarak, \[ve \]de PS1yerine renkli değişkeni, ama hiçbir şey işe görünüyor.

Renk kodları için değişkenleri nasıl kullanabilirim?


Bize verir misin .bashrc?
cuonglm

@cuonglm Bütün .bashrcleriniz bize aittir? Kendimi göstereceğim.
CivFan

Yanıtlar:


20

Çözüm, istemi tanımlarken, işlevleri değil, renk değişkenlerinin yerini almasıdır. Bunu yapmak için, başlangıçta denemiş olduğunuz gibi çift tırnak işareti kullanın, ancak komut istemi çizilene kadar değerlendirilmemeleri için komutlardan çıkın.

PS1="\u@\h:\w${YELLOW}\$(virtual_env)${GREEN}\$(git_branch)${RESET}$ "

Her komuttan \önce gelenlere dikkat edin $().

Bunu tekrarlarsak, şunu görürüz:

echo "$PS1"
\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ 

Gördüğünüz gibi, renk değişkenleri yerine kondu ancak komutları değiştirmedi.


1
$ (Git_branch) $ {YELLOW} vb. Kullanarak da yazdırmaya çalışıyorsa bu işe yaramaz gibi görünüyor. Sadece bu bölümde, tüm [] karakterlerini almaya devam edeceksiniz.
WB Reed,

7

Sorun, değişkeninizin GREEN"ters eğik çizgi braketi ters eğik çizgi sıfır üç üçünden" oluşan değişmez dizgiyi içermesidir. Örneğin terminalinizin rengini değiştirmesini sağlamak için gerektiği gibi bir ASCII çıkış karakteri içermez.

Kontrol karakterlerini manuel olarak GREEN(ve YELLOWve RESET) içine koyabilirsiniz , ancak çok daha iyi bir seçenek tputilk sırada kullanmaktır , böylece herhangi bir şeyi kodlamanıza gerek kalmaz ve herhangi bir terminal türünü desteklersiniz.

GREEN="$(tput setaf 2)"
YELLOW="$(tput setaf 3)"
RESET="$(tput setaf 0)"

Nedeni var vs ... direkt içine "sıfır üç üç ters eğik çizgi" koymak dünya PS1belli ters eğik çizgi dizilerinin bu yorumun bir olduğunu özellik bash kılavuzu içinde isteyen bölümüne bakın (Yön. Bu değiştirme oluşur önce parametre genişlemesi, komut sübstitüsyon, aritmetik genişleme ve fiyat teklifi kaldırma işlemi olsa da, diğer tüm işlemlerin sonuçlarına uygulanmaz.


5
Bu şekilde yaparken, renk değişkenlerini \[\]içine sarmanız gerekir $PS1. Örneğin: PS1='\u@\h:\w\[${YELLOW}\]'. Bunu yapmazsanız ve bir sonraki satıra kadar uzun bir komutla sonuçlanırsanız, her türlü sorunla karşılaşırsınız. Kabuk, \[\]hangi karakterlerin yazdırılamayacağını belirlemek için kullanır , bu nedenle istemi uzunluğu hesaplamasında dikkate almaz. Buna ihtiyacı var, böylece terminal genişliğini aştığında çizgiyi doğru çizebilir.
Patrick,

Bilmiyordum tput, teşekkürler. Şimdilik Patrick'in cevabını kullanacağım ancak bir şansım olduğunda bunu tekrar ziyaret edeceğim.
Ismail Badawi,

2

$ GREEN, $ YELLOW ve $ RESET doldurma şeklinizi değiştirin:

GREEN="$(echo -e "\033[32m")"
YELLOW="$(echo -e "\033[33m")"
RESET="$(echo -e "\033[0m")"

PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ '

1
Bu aslında Celada'nın cevabı ile aynı şeyi yapıyor. Ancak Celada, terminalin renk ayarı için farklı kaçış kodları kullanması durumunda daha taşınabilir. Aynı zamanda çok satırlı istemi olayı ile aynı sorunu olacak.
Patrick,

2
\[…\]Bit ihtiyaçları Bir değişkende şeyler değil, istemi kalması. Tamamen kaldırdınız, bu da ekran sorunlarına neden olacak (imleç bash'ın beklediği konumda değil).
Gilles 'SO- kötülük olmayı'

@Patrick endişelerinin yanı sıra, echo -e taşınabilir değildir.
helpermethod

1
Taşınabilir tput setafolmama özelliği ile daha fazla özellik geliyor - açık camgöbeği gibi "ışık" renk kümesinden seçim yapmanıza izin vermiyor. @ Cyrus'un cevabı ise öyle.
CivFan
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.