Alterna o formato da string de prompt do terminal gnome por comando?

9

Meu terminal tem um formato de prompt padrão como este:

  

nome de usuário @ nome da caixa / caminho / para / atual / diretório $

O código que o produz parece com isto: (tem algumas definições de cores também)

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

Se o caminho para o diretório atual ficar muito longo, torna-se desagradável trabalhar com o terminal porque você quebra constantemente as linhas. Nesses casos, eu preferiria um formato que produzisse uma string mais curta como esta:

  

nome de usuário @ boxname current_dir_name $

O código que produz seria semelhante a este (novamente com cor):

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

Alguém sabe como eu poderia alternar facilmente o formato da janela do terminal atual de um estilo para outro simplesmente digitando, por exemplo: prompttoggle ?

    
por Rotareti 08.09.2016 / 00:12

5 respostas

10

Armazene as variáveis PS1 longas e curtas com um nome diferente:

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

Certifique-se de definir PS1 para um deles inicialmente:

PS1="$PS1long"

Então você pode criar um alias como esse para alternar entre os dois valores PS1:

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

Adicionar todas as quatro linhas ao seu arquivo ~/.bashrc irá usar o comando disponível nas suas sessões Bash, aqui estão elas novamente para facilitar a cópia:

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

Você pode usar uma pequena função bash :

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

A função acima corresponde se o atual $PS1 contiver basename , se sim, então o PS1 sem basename está definido, caso contrário, o com basename está definido.

Coloque a função em ~/.bashrc para disponibilizá-la em todas as sessões interativas.

Exemplo:

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

foo@bar:~/spam/egg$ prompttoggle 

foo@bar egg $ prompttoggle

foo@bar ~/spam/egg $
    
por heemayl 08.09.2016 / 00:20
5

Ou ... faça duas pequenas funções very e adicione ao final do seu ~/.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') ; }

para um prompt abreviado, digite promptshort , para voltar ao caminho completo, digite promptlong

\W mostra o diretório de trabalho atual somente, então $(basename ${PWD}) é um exagero imho

Você pode combinar em uma função, mas "longo" e "curto" são descritivos e ambos têm menos pressionamentos de teclas do que "alternar";)

Em vez de adicionar uma linha para substituir o PS1, prefiro ajustar o código que a define (por exemplo, descomente force_color_prompt=yes e edite a linha após [ "$color_prompt" = yes ]; then )

    
por Zanna 08.09.2016 / 00:40
3

Aqui está uma definição da função ~/.bashrc que eu pessoalmente uso para redefinir / alternar meu prompt do prompt normal para apenas $ . Adapte-o conforme necessário para atender às suas necessidades.

resetps() {
    if [ "$PS1" = "$ " ] 
    then
        PS1=$OLDPS1 
    else
        OLDPS1=$PS1 
        export OLDPS1 
        PS1="$ " 
    fi 
} 
    
por Sergiy Kolodyazhnyy 08.09.2016 / 08:00
1

Esta é uma resposta para o seu problema (diretórios longos quebram a linha de comando) e não especificamente para a sua pergunta (como alterar o prompt de comando na hora).

Eu resolvi esse problema anos atrás com este aviso:

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

O que isso faz:

  1. exibe o valor de saída do comando anterior (isso é incrivelmente útil)
  2. exibe o usuário atual e o host em uma cor
  3. imprima o diretório de trabalho em outra cor (ajuste as cores ao seu gosto)
  4. produz o dólar e o espaço em uma nova linha , terminando as seqüências de cores antes da quebra de linha

Isso lhe dá todo o espaço necessário para o seu comando, não o desloca corretamente quando você está em uma estrutura de diretório profunda, não manipula a linha de digitação com códigos de cores (evitando bugs estranhos que acontecem às vezes), enquanto continua dando você a dica colorida de onde a saída de um comando terminou e a próxima começou:

    
por Tobia 08.09.2016 / 19:19