Enviando caracteres especiais para uma função personalizada

0

Eu li este ótimo artigo sobre como personalizar o prompt do bash:

link

Eu também li sobre o uso de 256 cores no bash:

link

Agora, esta é a aparência da minha .bashrc:

# Extended 256 colors
ext-color() {
    echo -ne "\[3[38;5;$1m\]$2\[3[m\]"
}

# Set a fancy prompt
PS1="'ext-color 172 \u' in 'ext-color 172 $(pwd)'"

Isso me deixa muito perto de ter um prompt laranja, mas o nome de usuário não está sendo impresso. Em vez disso, é assim:

u in /home/dave

Como modifico isso para imprimir o nome de usuário do usuário conectado no momento? Quero dizer assim:

dave in /home/dave
    
por David Kennedy 04.05.2013 / 22:23

2 respostas

2

É muito mais simples do que você está fazendo. Quando você executa o comando ext-color 172 \u (como parte da configuração do PS1 ou por conta própria), o shell analisa \u , removendo o que acha que é um \ irrelevante, antes de passá-lo para ext-color as $2 . A solução é simples: coloque-o entre aspas antes de passá-lo para ext-color :

PS1="$(ext-color 172 '\u') in $(ext-color 172 '\w')"

(Observe que eu também substituí os backquotes por $( ) , usei \w em vez de $(PWD) e citei '\w' pelo mesmo motivo que '\u' .)

    
por 05.05.2013 / 07:12
1

Adaptar a abordagem que parece funcionar na segunda parte do prompt, por exemplo:

PS1="'ext-color 172 $(whoami)' in 'ext-color 172 $(pwd)'"

ou ainda mais simples:

PS1="'ext-color 172 $USER' in 'ext-color 172 $(pwd)'"

ou ainda melhor:

PS1="$(ext-color 172 "$USER") in $(ext-color 172 "$(pwd)")"

A última versão não cortará a parte depois de um possível espaço no diretório atual por causa das aspas em torno da chamada pwd .

EDITAR: Isso não atualizará o diretório de trabalho, conforme observado no comentário. Eu nem sequer pensei nisso desde a pergunta específica sobre a parte do usuário (é tarde aqui :-)).

A maneira mais fácil ("correta", "somente") é apenas escrever

PS1='\[3[38;5;172m\]\u\[3[m\] in \[3[38;5;172m\]\w\[3[m\]'

e ignore a definição da função.

Expansão: para obter a variável PS1 para expandir dinamicamente as chamadas de função, use uma barra invertida para impedir a avaliação prematura:

PS1="$(ext-color 172 "\$USER") in $(ext-color 172 "\$PWD")"

deve funcionar.

    
por 04.05.2013 / 22:30