Gnome terminali komut istemi dizesinin biçimini komutla değiştir?


9

Terminalimin böyle bir varsayılan bilgi istemi formatı var:

kullaniciadi @ boxname / path / to / current / dizin $

Üreten kod şöyle görünür: (bazı renk tanımları da vardır)

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'

Geçerli dizine giden yol çok uzun olursa, sürekli satır kesdiğiniz için terminal ile çalışmak hoş olmaz. Bu gibi durumlarda, bunun gibi daha kısa bir dize üreten bir biçimi tercih ederim:

kullaniciadi @ boxname current_dir_name $

Üreten kod şöyle görünecektir (yine renkle):

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

Herkes kolayca sadece örneğin yazarak geçerli terminal penceresinin biçimini bir stilden diğerine nasıl geçiş yapabileceğini biliyor mu prompttoggle?


6
Bash'ın PROMPT_DIRTRIM parametresinin farkında mısınız ?
steeldriver

@steeldriver şimdiye kadar değil. Arasında geçiş yapılması PROMPT_DIRTRIM=0ve PROMPT_DIRTRIM=1için farklı değerler arasındaki geçiş daha basit görünüyor PS1ve sonuç hemen hemen aynıdır. Bilgi için teşekkürler!
Rotareti

PROMPT_DIRTRIMBirini kullanmak da komuta argümanlar ekleyebilir. Hiçbir argüman iletmezseniz PROMPT_DIRTRIM=0ve arasında PROMPT_DIRTRIM=1bir sayı geçirirseniz ve argüman olarak ayarladığınız bir sayıyı iletirseniz PROMPT_DIRTRIM. promptleno zaman komut için daha uygun bir isim olurdu.
Rotareti

Yanıtlar:


10

Hem uzun hem de kısa PS1değişkenlerinizi farklı bir adla depolayın :

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

PS1Başlangıçta bunlardan birine ayarladığınızdan emin olun :

PS1="$PS1long"

Ardından, iki PS1 değeri arasında geçiş yapmak için böyle bir takma ad yapabilirsiniz:

alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

~/.bashrcDosyanıza dört satırın tümü eklendiğinde , Bash oturumlarınızda bulunan komut görüntülenir, daha kolay kopyalama için işte yine:

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
PS1="$PS1long"
alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

7

Küçük bir bashişlev kullanabilirsiniz :

prompttoggle () { 
    if [[ $PS1 = *basename* ]]; then 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
    else 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
    fi ;}

Yukarıdaki fonksiyon eğer akım $PS1içeriyorsa eşleşirse basename, evet ise, PS1olmadan basenameayarlanır, aksi halde olan basenameayar ayarlanır.

~/.bashrcTüm etkileşimli oturumlarda kullanılabilir olmasını sağlamak için işlevi kendi başınıza koyun .

Misal:

foo@bar:~/spam/egg$ prompttoggle () { 
>     if [[ $PS1 = *basename* ]]; then 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
>     else 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
>     fi ;}

foo@bar:~/spam/egg$ prompttoggle 

foo@bar egg $ prompttoggle

foo@bar ~/spam/egg $

5

Ya da ... çok küçük iki işlev yapın ve~/.bashrc

# short prompt
promptshort() { export PS1=$(echo "$PS1" | sed 's/\\w/\\W/g') ; }

# full length prompt
promptlong() { export PS1=$(echo "$PS1" | sed 's/\\W/\\w/g') ; }

kısaltılmış bir bilgi istemi promptshortiçin, tam yola geri dönmek için şunu yazınpromptlong

\Wgösterileri Geçerli çalışma dizini sadece bu $(basename ${PWD})overkill IMHO

Bir işlevde birleştirebilirsiniz, ancak "uzun" ve "kısa" açıklayıcıdır ve her ikisinin de "geçiş" ten daha az tuş vuruşu vardır;)

PS1'i geçersiz kılmak için bir satır eklemek yerine, onu ayarlayan kodu değiştirmeyi tercih ederim (örneğin, uncomment force_color_prompt=yesve sonraki satırı düzenleyin [ "$color_prompt" = yes ]; then)


3

Burada, ~/.bashrcistemimi normal istemden adil duruma sıfırlamak / değiştirmek için kişisel olarak kullandığım bir işlev tanımı $. Gereksinimlerinize uyacak şekilde gerektiği gibi uyarlayın.

resetps() {
    if [ "$PS1" = "$ " ] 
    then
        PS1=$OLDPS1 
    else
        OLDPS1=$PS1 
        export OLDPS1 
        PS1="$ " 
    fi 
} 

1

Bu sorununuza bir cevaptır (uzun dizinler komut satırını keser) ve özellikle sorunuza değil (komut istemini nasıl değiştireceğinizi).

Bu sorunu yıllar önce bu istemle çözdüm:

PS1='\[\e[32;1m\]$? \u@\h \[\e[35;1m\]\w\[\e[m\]\n\$ '
#    └──green───┘         └──purple──┘  └─norm─┘

Bu ne yapar:

  1. önceki komutun çıkış değerini çıktılar (bu inanılmaz derecede faydalıdır)
  2. geçerli kullanıcıyı ve ana bilgisayarı tek bir renkte çıktılar
  3. çalışma dizinini başka bir renkte çıktılar (renkleri zevkinize göre ayarlayın)
  4. yeni satırda dolar ve boşluk çıktısı vererek satır sonundan önce renk dizilerini sonlandırır

Bu, komutunuz için ihtiyacınız olan tüm alanı verir, derin bir dizin yapısındayken doğru kaydırmaz, yazma satırını renk kodlarıyla (bazen meydana gelen garip hatalardan kaçınırken) değiştirmez, yine de renkli bir komutun çıktısının bittiği ve bir sonraki komutun nerede başladığına dair ipucu:

resim açıklamasını buraya girin

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.