Prompt colorido no KornShell

11

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

echo -e "\033[34mLinux\033[00m"

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

printf "\033[34mLinux\033[00m"

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

Kazark
fonte

Respostas:

10

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

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

Ou use a saída do echocomando que você descobrir que está funcionando:

PS1="$(echo -e "\033[35mLinux\033[00m")"
homem a trabalhar
fonte
É nessas horas que percebo que ainda sou um noob de linha de comando. Eu geralmente me sinto tão bem em comparação com meus amigos. :) A primeira versão funcionou bem; que truque legal! Não tive sucesso com a segunda versão. +1
Kazark 05/07/12
5

Você precisa colocar um caractere de escape literal na PS1variável. 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 printbuilt-in. Mksh entende \ecomo escapar, mas pdksh requer o código octal \033.

PS1=$(print '\033[34mLinux\033[00m')

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

PS1=$'\e[34mLinux\e[00m'
Gilles 'SO- parar de ser mau'
fonte
2
Na verdade, mkshtambém suporta $'…'- reconhecidamente porque Dave Korn (o Korn no Korn Shell) insistiu que eu o adicionasse.
mirabilos
@mirabilos Ah, obrigado. Provavelmente digitei essa resposta em uma máquina com mksh R39 e não verifiquei as versões mais recentes.
Gilles 'SO- stop be evil'
2

Eu os uso mkshpara 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 '

e um pouco diferente shellpara 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 '

insira a descrição da imagem aqui

Como os caracteres especiais não foram copiados, eis uma pasta pastebin para o usuário normal e a raiz.

Stuart Cardall
fonte
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 de terminal 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 especiais de barra invertida como \ w para o diretório de trabalho, ou pode precisar nomear variáveis ​​de ambiente ou incorporar linhas de comando na string.

  4. Como dizer ao shell quais caracteres são impressos e quais não. O shell não sabe onde as seqüências de escape do terminal começam e terminam. Se o shell tiver um editor de linha de comando ou algo semelhante, ele precisará saber quais caracteres serão impressos para saber 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 sequê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 sequência. No início da string, você escreve esse caractere seguido de um retorno de carro ASCII. Então você escreve o mesmo caractere antes e depois de cada sequência de escape. O z3ntu escolheu \ a como o caractere marcador.

Derek Peschel
fonte
0

Graças a respostas anteriores e outras fontes, pude sugerir:

Prompt do shell Korn:

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

Promessa do Bash:

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

Eles dão o mesmo prompt colorido (sim, eu falo inglês da rainha;)) 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ém 'DOSsy' em vez de 'nixy' com "$", mas se você quisesse o sigil ("$"), seria:

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

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

export PS1="..."

e mude o DOSsy para:

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

ou

setx PROMPT "%username%@%computername% $P$_$$"
skeetastax
fonte