Prompt colorido no KornShell

11

De acordo com esta postagem do StackOverflow , é possível ter um prompt colorido no KornShell. Eu não consegui descobrir como fazer isso. Eu sou capaz de usar cores:

echo -e "3[34mLinux3[00m"

fornece uma saída "Linux" azul, como acontece:

printf "3[34mLinux3[00m"

No entanto, quando eu incorporar os códigos de escape na minha variável de prompt PS1 , eles não estão sendo escapados. O que preciso fazer para obter um prompt colorido? Além de ser um pouco idiota para o eyecandy, acho que um prompt colorido é útil ao analisar visualmente a saída.

    
por Kazark 05.07.2012 / 20:19

5 respostas

10

Basta usar um caractere Esc literal, digitado com Ctrl - v , Esc (será exibido como ^[ na tela) :

PS1="^[[34mLinux^[[00m"

Ou use a saída do comando echo que você descobriu que está funcionando:

PS1="$(echo -e "3[35mLinux3[00m")"
    
por 05.07.2012 / 20:28
4

Você precisa colocar um caractere de escape literal na variável PS1 . Ksh88 e clones como pdksh e mksh (versões mais antigas) não têm sintaxe literal para caracteres de controle, exceto através do print integrado. Mksh entende \e para escape, mas pdksh requer o código octal 3 .

PS1=$(print '3[34mLinux3[00m')

ATT ksh93 introduz a sintaxe literal com escape de folga $'…' (também disponível em mksh desde R39b). Você pode usar escapes de barra invertida para colocar caracteres de controle nesses literais.

PS1=$'\e[34mLinux\e[00m'
    
por 06.07.2012 / 03:21
2

Eu os uso em mksh para um usuário shell :

# custom prompt see http://comments.gmane.org/gmane.os.miros.mksh/126
PS1=$'\a\r\a\e[1;34m\a ^ ^  ^ ^ | \a\e[36m\a${USER:=$(ulimit -c 0; id -un 2>/dev/null || echo
\?)}@${HOSTNAME%%.*}\a\e[34m\a | ^ ^  ^ ^ | \a\e[0;33m\a$(local d=${PWD:-?} p=~; [[ $p = ?(*/) ]] || d=${d/#$p/~};
print -nr -- "$d")\a\e[1;34m\a |\n ^ ^  ^ ^ | \a\e[32m\a$(date +%H:%M)\a\e[34m\a | ^ ^ >>\a\e[0m\a '

& um shell ligeiramente diferente para root :

PS1=$'\a\r\a\e[1;34m\a ^ ^  ^ ^  ^   \a\e[31m\a${USER:=$(ulimit -c 0; \
    id -un 2>/dev/null || echo \?)}@${HOSTNAME%%.*}\a\e[34m\a  ^ ^  ^ ^  ^ ^  ^   \a\e[0;33m\a$(
        local d=${PWD:-?} p=~
        [[ $p = ?(*/) ]] || d=${d/#$p/~}
        print -nr -- "$d"
)\a\e[1;34m\a  ^ ^ \n ^ ^  ^ ^  ^   \a\e[32m\a$(date +%H:%M)\a\e[34m\a  ^ ^  ^ ^   \a\e[0m\a '

Comooscaracteresespeciaisnãoforamcopiados, aqui está uma pasta de pastebin para o usuário normal e o root.

    
por 03.08.2015 / 18:42
1

Várias coisas estão acontecendo nas respostas das pessoas, cada uma envolvendo uma sintaxe diferente.

  1. As seqüências de escape para o seu programa terminal são fornecidas na documentação.

  2. Como codificar as seqüências de escape do terminal na variável PS1, por exemplo \ e ou escape literal. Isso depende do shell.

  3. Como adicionar informações alteradas ao prompt, por exemplo, o nome do host, o diretório atual, etc. Isso também depende do shell. Você pode usar sequências de barra invertida especiais como \ w para o diretório de trabalho, ou pode ser necessário nomear variáveis de ambiente ou incorporar linhas de comando na string.

  4. Como dizer ao shell quais caracteres são impressos e quais caracteres não. O shell não sabe onde suas seqüências de escape terminais começam e terminam. Se o shell tiver um editor de linha de comando ou algo semelhante, ele precisará saber quais caracteres são impressos para que ele saiba onde está o cursor. Sem esse detalhe, seu prompt pode parecer correto, mas a edição pode se comportar de maneira estranha.

    • No bash, você coloca \ [antes de cada seqüência de escape e \] depois.

    • No ksh, você escolhe um único caractere ASCII não imprimível que não pode ocorrer em nenhum outro lugar da string. No início da string, você escreve esse caractere seguido por um retorno de carro ASCII. Então você escreve o mesmo caractere antes e depois de cada seqüência de escape. O z3ntu escolheu \ a como o caractere marcador.

por 28.12.2016 / 04:24
0

Graças a respostas anteriores e outras fontes, consegui apresentar estas:

Solicitação de shell do Korn:

PS1="$(echo "3[32m'logname'3[35m@3[32m'hostname' 3[33m'pwd'3[36m\n\$3[0m")"

Aviso de bash:

PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"

Eles fornecem o mesmo prompt colorido (sim, eu falo o inglês do Queen;)) no formato:

username@computername /current/working/directory
$

O equivalente do DOS (embora não haja opções de cores) é:

prompt %username%@%computername% $P$_$G

que dá:

username@computername /current/working/directory
>

O ">" é mantê-lo 'DOSsy' ao invés de 'nixy' com "$", mas se você quisesse o sigil ("$") em vez disso, seria:

prompt %username%@%computername% $P$_$$

Desde que sua conta de login tenha as permissões necessárias, para tornar as 'nixies' permanentes, prefixá-las com "export":

export PS1="..."

e altere o DOSsy para:

setx PROMPT "%username%@%computername% $P$_$G"

ou

setx PROMPT "%username%@%computername% $P$_$$"
    
por 15.11.2018 / 05:34