Indicador de color de línea de comando MySQL

22

Quiero agregar colores a la línea de comandos de MySQL.

Tengo hasta ahora en un script (database.sh):

mysql -uroot -hlocalhost -A --prompt="\u@\h:\d> "

Me gustaría rootser rojo , @ser azul , localhostser verde y databaseser cian :

root@localhost:database>

¿Es posible hacer esto en mi script?

EscoMaji
fuente
1
Lo vi pero no funciona
EscoMaji
Sí, creo que es posible de la misma manera que en un indicador de shell normal. Su mejor opción es probablemente algún contenedor o un cliente MySQL más avanzado.
micke
1
¿Su configuración admite códigos de escape ANSI? Si es así, puede usarlos de la siguiente manera: --prompt = "^ [[1; 33mD ESTA PARTE ESTÁ EN COLOR AMARILLO ^ ^ [[0m \ u @ \ h: \ d>"
Hennes

Respuestas:

14

No escuches a las personas que dicen que no puedes. Aquí:

$ alias colormysql=$(echo -e 'mysql --prompt="\x1B[31m\\u\x1B[34m@\x1B[32m\\h\x1B[0m:\x1B[36m\\d>\x1B[0m "')

Luego:

$ colormysql -hHOSTNAME -uUSERNAME -pPASSWORD ...
dossy
fuente
¿Puede dar más explicaciones de por qué esto funciona, pero no puede simplemente pasar los códigos ANSI?
Bryan Agee
$(foo)ejecuta el resultado de foo, en este caso la salida de echo. El -e to echo expande el \ x1b en un carácter de escape. El \ x1b [31m es un código de control de terminal que establece el color actual en rojo. Etcétera. \ x1b [0m devuelve el color al color del terminal predeterminado.
Irongaze.com
1
cuando pruebe colores, le recomiendo que omita el paso de alias, por ejemplo haciendo:mysql --prompt="`echo -e '\033[01;32m\\d\033[01;34m >\033[00m '`"
Puggan Se
44
También agregar códigos de escape que encierran los códigos de color hace que esto funcione correctamente (navegar por el historial funcionará sin que su solicitud sea un desastre) como este: $ alias colormysql = $ (echo -e 'mysql --prompt = "\ 001 \ x1B [31m \ 002 \\ u \ 001 \ x1B [34m \ 002 @ \ 001 \ x1B [32m \ 002 \\ h \ 001 \ x1B [0m \ 002: \ 001 \ x1B [36m \ 002 \\ d> \ 001 \ x1B [0m \ 002 "')
David Santamaria
2
@CyprianGuerra - Mira el comentario de @ david-santamaria arriba, usando \001y \002alrededor de las secuencias para un readlinesoporte adecuado . $ alias colormysql=$(echo -e 'mysql --prompt="\001\x1B[31m\002\\u\001\x1B[34m\002@\001\x1B[32m\002\\h\001\x1B[0m\002:\001\x1B[36m\002\\d>\001\x1B[0m\002 "') Parece haber algún tipo de problema de representación con copiar y pegar que desde el navegador, donde la \002:\001parte del comando se coloca en el portapapeles como \002:\<200c><200b>001(donde <200c>y <200b>son caracteres que no se imprimen, probablemente el CR / NL de word- envase).
dossy
8

Tutorial sobre la configuración del indicador mysql coloreado.

Paso 1. Comprende cómo iniciar sesión normalmente con un indicador de configuración:

eric@dev ~ $ mysql --host=yourhost.com -u username --prompt="foobar> " -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 711
Server version: 5.6.19 MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

foobar> 

Paso 2. Comprende cómo puedes canalizar una expresión interpretada a través de echo a 'alias':

Que hace exactamente lo mismo que el paso 1 anterior:

eric@dev ~ $ alias penguins=$(echo -e 'mysql --host=yourhost.com -u dev --prompt="foobar> " -p')
eric@dev ~ $ penguins
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 713
Server version: 5.6.19 MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

foobar> exit
Bye
eric@dev ~ $

Paso 3. Comprende cómo echo -e evalúa la expresión coloreada:

Esto colorea el indicador "foobar>" en rojo:

alias penguins=$(echo -e 'mysql --host=yourhost.com -u dev --prompt="\x1B[31mfoobar>\x1B[0m " -p')
penguins

Me gusta esto:

ingrese la descripción de la imagen aquí

Paso 4. Si estás confundido sobre lo que está sucediendo aquí:

Mira la expresión: \x1B[31mfoobar>\x1B[0m

Tiene tres partes:

code               what it means:

\x1B[31m           Start colorizing, 31m is red.
foobar>            prompt text
\x1B[0m            Stop colorizing.

Paso 4. Avanzado, hagamos que el mensaje sea realmente agradable:

eric@dev ~ $ alias penguins=$(echo -e 'mysql --host=yourhost.com -u dev --prompt="\x1B[31m\\u\x1B[34m@\x1B[32m\\v\x1B[0m:\x1B[36m\\d>\x1B[0m " -p')
eric@dev ~ $ penguins

ingrese la descripción de la imagen aquí

Si no está seguro de lo que hace este código masivo:

\x1B[31m\\u\x1B[34m@\x1B[32m\\v\x1B[0m:\x1B[36m\\d>\x1B[0m

Explicación:

Code         Note
\x1B[31m     Start colorizing red
\\u          escape the backslash for passage through echo, and print username
\x1B[34m     Start colorizing dark blue
@            literal at sign
\x1B[32m     Start colorizing green
\\v          escape the backslash for passage through echo, print server version
\x1B[0m      Stop colorizing
:            literal colon
\x1B[36m     Start colorizing cyan
\\d>         Backslash for passage through echo, print default db and >
\x1B[0m      Stop colorizing.

Así que wow Mucho código.

Eric Leschinski
fuente
1
¿Alguna idea sobre cómo escapar de los códigos de terminal correctamente para que readlineno se confunda la longitud de la línea y mysqlsea ​​posible editar varias líneas en la línea de comando? (intente escribir varias líneas, luego mantenga presionada la tecla de retroceso)
cprn
Esta es una pregunta tangente completamente separada que debe formularse como una pregunta separada de stackoverflow. Por supuesto, es posible con acceso a un lenguaje de programación completo, pero la pregunta es cómo, no lo sé, sin dedicarle algunas horas.
Eric Leschinski
0

Quería que el mensaje estuviera en el título de mis terminales, que es esencialmente el mismo problema que querer un mensaje de color, solo un código de escape diferente. Encontré esto y me pregunté si podría hacerlo sin tener que recordar un alias especial como el colormysqletc. mencionado en las respuestas.

He agregado lo siguiente a mi .bashrcque hace el truco en mi máquina:

export MYSQL_PS1=$(echo -e "\033]0;\u@\h [\d]\007\u@\h [\d]> ")

lo que esto hace es usar echo -epara generar los caracteres de escape sin procesar (en lugar de los simbólicos) a la MYSQL_PS1variable. Esto también debería funcionar con colores.

Marlies
fuente
-2

Es una respuesta bastante desafortunada, pero no puedes.


Con respecto al uso de secuencias de escape ANSI, MySQL solo permite lo siguiente :

Puede usar las secuencias de escape “\ b”, “\ t”, “\ n”, “\ r”, “\” y “\ s” en los valores de opción para representar el retroceso, la pestaña, la nueva línea, el retorno de carro, barra invertida y caracteres espaciales.


Con respecto a la respuesta de cmjdmiller , grc solo funciona para mostrar la salida del shell de MySQL a través de un "localizador".


Lo mejor que podría hacer es el uso rlwrap como esto: rlwrap -a -p'GREEN' mysql -uroot -hlocalhost -A --prompt="\u@\h:\d> ". Sin embargo, esto no le dará un control detallado, ya que colorea todo el mensaje. También tenga cuidado porque muestra la contraseña en texto sin cifrar.

Aurélien Derouineau
fuente
Esto está fuera de fecha. Hay una gran cantidad de valores posibles para la opción de solicitud. Ver aquí: dev.mysql.com/doc/refman/5.6/en/mysql-commands.html
Irongaze.com
resultado para mí en stack-over-flow
Shakiba Moshiri
No está tan desactualizado como simplemente equivocado. por un lado, las secuencias de escape ANSI son algo completamente independiente de MySQL, y por otro lado, ciertamente pueden usarse, como se demuestra ampliamente en las otras respuestas aquí.
Jeff