Aviso de color en KornShell

11

De acuerdo con esta publicación de StackOverflow , es posible tener una solicitud de color en KornShell. No he podido averiguar cómo hacer esto. Puedo usar el color:

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

da una salida azul "Linux", al igual que:

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

Sin embargo, cuando incorporo los códigos de escape en mi PS1variable de solicitud, no se escapan. ¿Qué debo hacer para obtener un mensaje de color? Además de ser una especie de imbécil para los llamativos, encuentro que un indicador de color es útil al analizar visualmente la salida.

Kazark
fuente

Respuestas:

10

Simplemente use un carácter Esc literal, ingresado con Ctrl- v, Esc(se mostrará como ^[en la pantalla):

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

O use la salida del echocomando que descubra que está funcionando:

PS1="$(echo -e "\033[35mLinux\033[00m")"
hombre trabajando
fuente
Es en momentos como este que me doy cuenta de que todavía soy un novato en la línea de comandos. Por lo general me siento muy bien en comparación con mis amigos. :) La primera versión funcionó bien; ¡Qué buen truco! No tuve éxito con la segunda versión. +1
Kazark
5

Necesita poner un carácter de escape literal en la PS1variable. Ksh88 y clones como pdksh y mksh (versiones anteriores) no tienen sintaxis literal para los caracteres de control, excepto a través de la función printintegrada. Mksh entiende \epor escape, pero pdksh requiere el código octal \033.

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

ATT ksh93 presenta la sintaxis literal con escape de reacción $'…'(también disponible en mksh desde R39b). Puede usar las barras invertidas para colocar caracteres de control en estos literales.

PS1=$'\e[34mLinux\e[00m'
Gilles 'SO- deja de ser malvado'
fuente
2
En realidad, mkshtambién es compatible $'…', es cierto porque Dave Korn (el Korn en Korn Shell) insistió en que lo agregue.
mirabilos
@mirabilos Ah, gracias. Probablemente escribí esa respuesta en una máquina con mksh R39 y no verifiqué las versiones más recientes.
Gilles 'SO- deja de ser malvado'
2

Los uso mkshpara un usuario 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 '

y un poco 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 '

ingrese la descripción de la imagen aquí

Como los caracteres especiales no se copiaron, aquí hay una pasta pastebin para el usuario normal y la raíz.

Stuart Cardall
fuente
1

Están sucediendo varias cosas en las respuestas de las personas, cada una con una sintaxis diferente.

  1. Las secuencias de escape para su programa de terminal que figuran en la documentación.

  2. Cómo codificar las secuencias de escape de terminal en la variable PS1, por ejemplo \ e o escape literal. Esto depende de la cáscara.

  3. Cómo agregar información cambiante a la solicitud, por ejemplo, el nombre de host, el directorio actual, etc. Esto también depende del shell. Es posible que pueda usar secuencias especiales de barra invertida como \ w para el directorio de trabajo, o puede que tenga que nombrar variables de entorno o incrustar líneas de comando en la cadena.

  4. Cómo decirle al shell qué caracteres se imprimen y cuáles no. El shell no sabe dónde comienzan y terminan las secuencias de escape de su terminal. Si el shell tiene un editor de línea de comandos o algo similar, necesita saber qué caracteres se imprimen para saber dónde está el cursor. Sin este detalle, su mensaje podría verse bien, pero la edición puede comportarse de manera extraña.

    • En bash, pones \ [antes de cada secuencia de escape y \] después.

    • En ksh, elige un único carácter ASCII sin impresión que no puede aparecer en ningún otro lugar de la cadena. Al comienzo de la cadena, escribe ese carácter seguido de un retorno de carro ASCII. Luego escribes el mismo personaje antes y después de cada secuencia de escape. z3ntu eligió \ a como el carácter marcador.

Derek Peschel
fuente
0

Gracias a respuestas anteriores y otras fuentes, pude llegar a estas:

Indicador de shell Korn:

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

Aviso de bash:

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

Estos dan el mismo aviso de color (sí, hablo el inglés de Queen;)) en el formato:

username@computername /current/working/directory
$

El equivalente de DOS (aunque no hay opciones de color) es:

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

lo que da:

username@computername /current/working/directory
>

El ">" lo mantiene 'DOSsy' en lugar de 'nixy' con "$", pero si quisieras el sigilo ("$") en su lugar, sería:

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

Siempre que su cuenta de inicio de sesión tenga los permisos requeridos, para hacer que las 'nixies' sean permanentes, agréguelas con "exportar":

export PS1="..."

y cambia el DOSsy a:

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

o

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