Prompt colorido no KornShell

Prompt colorido no KornShell

De acordo comesta postagem 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 "Linux" azul, assim como:

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

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

Responder1

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ê descobriu que está funcionando:

PS1="$(echo -e "\033[35mLinux\033[00m")"

Responder2

Você precisa colocar um caractere de escape literal na PS1variável. Ksh88 e clones como pdksh e mksh (versões mais antigas) não possuem sintaxe literal para caracteres de controle, exceto por meio do printintegrado. Mksh entende \eescape, mas pdksh requer o código octal \033.

PS1=$(print '\033[34mLinux\033[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'

Responder3

Eu uso isso 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 '

& 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,aqui está uma pasta pastebintanto para o usuário normal quanto para o root.

Responder4

Graças às respostas anteriores e outras fontes, consegui chegar a estas:

Prompt de shell Korn:

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

Solicitação do 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 Queen's English;)) no formato:

username@computername /current/working/directory
$

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

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

que dá:

username@computername /current/working/directory
>

O ">" está mantendo-o 'DOSsy' em vez de 'nixy' com "$", mas se você quisesse o sigilo ("$") então seria:

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

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

export PS1="..."

e altere o DOSsy para:

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

ou

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

informação relacionada