bash PS1 kurulumu


9

PS1'i aşağıdaki gibi yapılandırmaya çalışıyorum.

Yeşil = "\ [\ e [32; 1 m \]"
Kırmızı = "\ e [0, 31m"
Mor = "\ e [0, 35m"
STARTCOLOR = "\ [\ e [40m \]"
ENDCOLOR = "\ [\ e [0m \]"
PS1 dışa aktar = "$ STARTCOLOR $ Yeşil \ u @ $ Mor \ h $ Kırmızı \ w $ Yeşil> $ ENDCOLOR"

Bazı sorularım var.

  • "[\ E [32; 1m]" ve \ e [32; 1m "arasındaki fark nedir?
  • 'PS1'i dışa aktar' komutunu çalıştırdıktan sonra iyi çalışıyor, ancak girdiye yaklaşık 20 karakter verdiğimde, eklediğim gibi karakterlerin üzerine yazılıyor. Bunun nesi var?
  • STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m) 'in anlamı nedir?

http://a.imageshack.us/img8/606/resultqm.jpg

KATMA

Bazı testlerden sonra, sorunu çözebilecek aşağıdaki değişikliği aldım. Yani, "\ e" biçimi "\ [\ e" biçimiyle değiştirilmelidir.

Kırmızı = "\\ e [1; 31m" - çalışmıyor
Kırmızı = "\ [\ e [1; 31m \]" - çalışıyor

Yanıtlar:


12

Istemi ayarlamak için bir yardımcı işlevi var ve kaçış kodu başvuruları aramak için daha fazla zaman harcamak istemiyorum, ben içine tüm metin renk değerleri kodladım.

function set_prompt ( )
{
    # Prompt setup
    # ##################

    # Black            \e[0;30m
    # Blue             \e[0;34m
    # Green            \e[0;32m
    # Cyan             \e[0;36m
    # Red              \e[0;31m
    # Purple           \e[0;35m
    # Brown            \e[0;33m
    # Gray             \e[0;37m
    # Dark Gray        \e[1;30m
    # Light Blue       \e[1;34m
    # Light Green      \e[1;32m
    # Light Cyan       \e[1;36m
    # Light Red        \e[1;31m
    # Light Purple     \e[1;35m
    # Yellow           \e[1;33m
    # White            \e[1;37m

    local COLOR_DEFAULT='\[\e[0m\]'
    local COLOR_BLACK='\[\e[0;30m\]'
    local COLOR_BLUE='\[\e[0;34m\]'
    local COLOR_GREEN='\[\e[0;32m\]'
    local COLOR_CYAN='\[\e[0;36m\]'
    local COLOR_RED='\[\e[0;31m\]'
    local COLOR_PURPLE='\[\e[0;35m\]'
    local COLOR_BROWN='\[\e[0;33m\]'
    local COLOR_GRAY='\[\e[0;37m\]'
    local COLOR_DARK_GRAY='\[\e[1;30m\]'
    local COLOR_L_BLUE='\[\e[1;34m\]'
    local COLOR_L_GREEN='\[\e[1;32m\]'
    local COLOR_L_CYAN='\[\e[1;36m\]'
    local COLOR_L_RED='\[\e[1;31m\]'
    local COLOR_L_PURPLE='\[\e[1;35m\]'
    local COLOR_YELLOW='\[\e[1;33m\]'
    local COLOR_WHITE='\[\e[1;37m\]'

    local PS1_SET_TITLE='\[\e]0;\w\a\]'

    local PS1_SET_TIME="${COLOR_DEFAULT}\t"
    local PS1_SET_RET_CODE="${COLOR_L_RED}(\$?)"
    local PS1_SET_USER="${COLOR_L_GREEN}\u@\h"
    local PS1_SET_PWD="${COLOR_YELLOW}\w"

    local PS1_LN_1="${PS1_SET_TITLE}\n"
    local PS1_LN_2="${PS1_SET_TIME} ${PS1_SET_RET_CODE} "
    local PS1_LN_2="${PS1_LN_2}${PS1_SET_USER} ${PS1_SET_PWD} ${COLOR_DEFAULT}\n"

    echo "${PS1_LN_1}${PS1_LN_2}"
}

Daha sonra şunları yapabilirsiniz:

PS1=$( set_prompt )

# Use '#' for root shell
export PS1=${PS1}'$ '

unset -f set_prompt

VT100 terminal kodlarını açıklayan bağlantı: http://www.termsys.demon.co.uk/vtansi.htm

\[- yazdırılmayan karakter
\]dizisini başlat - yazdırılmayan karakter dizisini sonlandır

  • "[\ E [32; 1m]" ve \ e [32; 1m "arasındaki fark nedir?

Aynı değil ve \[\e[32;1m\]'. Without[] `diziyi konsolda yazdırmaya çalışmalıdır.

  • STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m) 'in anlamı nedir?

STARTCOLOR, arka planı siyah olarak ayarlamak anlamına gelir, ENDCOLOR tüm metin niteliklerini sıfırlamak anlamına gelir, yani 'bana varsayılan konsol rengini ver'


+1 Çok hoş !!! Bu benim bashrc kopyalamak sakıncası yok :)
Eldelshell

@Ubersoldat. Bir şey değil.
Alexander Pogrebnyak

1
\$Kök ve kök olmayan gösterge arasında otomatik olarak geçiş yapmak için kullanın .
sonraki duyuruya kadar duraklatıldı.

9

Bash el kitabından:

\[    bir terminal kontrol dizisini bilgi istemine gömmek için kullanılabilecek
\]    bir dizi yazdırılmamış karakter dizisini başlatma

\[ve \]terminale aktarılmaz. Bash'a aralarındaki karakterlerin yazdırılmayacağını söylerler. Onlar olmadan bash, kaçış karakterini (e, g. [32;1m) İzleyen dizinin ekranda herhangi bir yer kaplamadığını bilmiyordu, bu da neden dışarıda bıraktığınızda istemin uzunluğunu doğru hesaplamadığını açıklıyor.

Sorunuzda çok tutarlı olmadığınızı unutmayın (ya da belki de sadece Markdown ile ilgili bir hatadır); $PS1yalnızca bir parantez (tam anlamıyla görüntülenecek olan) değil, gerçek bir ters eğik çizgi parantez sırasına sahip olmanız gerekir .

İle başlayan kaçış dizileri \eterminal öykünücüsü tarafından yorumlanır. Bunlar Xterm kontrol dizileri (ctlseqs) belgesinde belgelenmiştir (diğer terminal emülatörleri çoğunlukla uyumlu olma eğilimindedir). Örneğin, \e[32;1mkoyu ve yeşil ön plana geçer; \e[40marka plan rengini siyaha dönüştürür; \e[0mvarsayılan öznitelikleri geri yükler.


3

Çoğu modern terminal emülatörü, ekranın çeşitli yönlerini kontrol etmek için ANSI kaçış kodlarını kullanabilir.

ANSI kodlarının çoğu, 2 karakterlik ESC- [Bu kaçış karakteri (ASCII ondalık 27) ve ardından açık köşeli parantez karakteri ile başlar. Bu dizi, CSI veya Kontrol Dizisi Başlatıcı olarak da bilinir.

Çıkış karakteri bir karakter olmadığından doğrudan yazabilirsiniz (Esc tuşunun başka, genellikle uygulamaya özgü olanları kullanır) bash buna başvurmak için '\ e' kullanır.

Metin rengini değiştirmek ANSI Grafik Modunu Ayarla komutunu kullanır:

\e[<value>m

burada <value>, noktalı virgülle ( ;) ayrılmış değerlerin bir listesi olabilir . Normalde yalnızca bir değer kullanılır, ancak kalın özellik renk özellikleriyle birlikte yararlıdır.

Alexander Pogrebnyak'ın cevabında listelenen değerlere bakıldığında, noktalı virgülün önündeki 0 veya 1 kalın veya kalın değil:

\e[1m  # bold
\e[5m  # blink
\e[0m  # all attributes off

Kodların kullanışlı bir listesi var http://ascii-table.com/ansi-escape-sequences.php

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.