Prompt de cores da linha de comando do MySQL

22

Quero adicionar cores ao prompt de cores da linha de comando do MySQL.

Eu tenho até agora em um script (database.sh):

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

Eu gostaria rootde ser vermelho , @para ser azul , localhosta ser verde e databaseser ciano :

root@localhost:database>

É possível fazer isso no meu script?

EscoMaji
fonte
11
Eu vi isso, mas ele não funciona
EscoMaji
Sim, eu acho que é possível da mesma maneira que no seu prompt de shell regular. Sua melhor aposta é provavelmente algum invólucro ou um cliente MySQL mais avançado.
5132 micke
11
Sua instalação suporta códigos de escape ANSI? Se isso acontecer, você poderá usá-los da seguinte maneira: --prompt = "^ [[1; 33mDESTA PARTE ESTÁ EM COR AMARELA ^ [[0m \ u @ \ h: \ d>"
Hennes

Respostas:

14

Não dê ouvidos a pessoas que dizem que você não pode. Aqui:

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

Então:

$ colormysql -hHOSTNAME -uUSERNAME -pPASSWORD ...
dossy
fonte
Você pode dar mais explicações sobre por que isso funciona, mas você não pode simplesmente passar códigos ANSI?
Bryan Agee
$(foo)executa o resultado de foo, neste caso, a saída do eco. O eco -e expande o \ x1b em um caractere de escape. O \ x1b [31m é um código de controle de terminal que define a cor atual para vermelho. E assim por diante. \ x1b [0m retorna a cor à cor padrão do terminal.
Irongaze.com
11
ao testar cores, eu recomendate você pular a etapa apelido, por exemple fazendo:mysql --prompt="`echo -e '\033[01;32m\\d\033[01;34m >\033[00m '`"
Puggan Se
4
A adição de códigos de escape que incluam os códigos de cores faz com que isso funcione corretamente (a navegação no histórico funcionará sem que a sua solicitação seja uma bagunça) assim: $ 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 - Veja o comentário de @ david-santamaria acima, usando \001e \002ao redor das seqüências para obter o readlinesuporte adequado . $ 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 haver algum tipo de problema de renderização ao copiar e colar no navegador, onde a \002:\001parte do comando está sendo colocada na área de transferência como \002:\<200c><200b>001(onde <200c>e <200b>são caracteres não imprimíveis, provavelmente o CR / NL do word- invólucro).
dossy
8

Passo a passo sobre como configurar o prompt mysql colorido.

Etapa 1. Entenda como efetuar login normalmente com um prompt definido:

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> 

Etapa 2. Entenda como você pode canalizar uma expressão interpretada através de eco para 'alias':

Que faz exatamente o mesmo que a etapa 1 acima:

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 ~ $

Etapa 3. Entenda como echo -e avalia a expressão colorida:

Isso mostra o prompt "foobar>" em vermelho:

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

Como isso:

insira a descrição da imagem aqui

Etapa 4. Se você está confuso sobre o que está acontecendo aqui:

Veja a expressão: \x1B[31mfoobar>\x1B[0m

Tem três partes:

code               what it means:

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

Etapa 4. Avançado, vamos fazer o prompt muito bom:

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

insira a descrição da imagem aqui

Se você está confuso sobre o que esse código massivo faz:

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

Explicação:

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.

Então uau. Muitos códigos.

Eric Leschinski
fonte
11
Alguma idéia de como escapar dos códigos dos terminais corretamente, para que readlinenão se confunda com o comprimento da linha e mysqlque seja possível editar várias linhas na linha de comando? (tentar escrever várias linhas, pressione em seguida, e backspace espera)
CPRN
Essa é uma pergunta tangente completamente separada que deve ser feita como uma pergunta separada sobre o stackoverflow. É claro que é possível com o acesso a uma linguagem de programação completa, mas a questão é como, eu não sei sem dedicar algumas horas a ela.
Eric Leschinski 01/12/2015
0

Eu queria que o prompt estivesse no título dos meus terminais, que é essencialmente o mesmo problema que desejar um prompt colorido, apenas um código de escape diferente. Me deparei com isso e me perguntei se eu poderia fazer isso sem ter que me lembrar de um apelido especial como o colormysqletc mencionado nas respostas.

Eu adicionei o seguinte ao meu, .bashrcque faz o truque na minha máquina:

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

o que isso faz é usar echo -epara gerar os caracteres de escape brutos (em vez dos simbólicos) para a MYSQL_PS1variável. Isso também deve funcionar com cores.

Marlies
fonte
-2

É uma resposta bastante infeliz, mas você não pode.


Em relação ao uso de seqüências de escape ANSI, o MySQL permite apenas o seguinte :

Você pode usar as seqüências de escape "\ b", "\ t", "\ n", "\ r", "\" e "\ s" nos valores das opções para representar o backspace, guia, nova linha, retorno de carro, barra invertida e caracteres de espaço.


Com relação à resposta do cmjdmiller, o grc funciona apenas para exibir a saída do shell do MySQL através de um "pager".


O melhor que você pode fazer é usar rlwrap assim: rlwrap -a -p'GREEN' mysql -uroot -hlocalhost -A --prompt="\u@\h:\d> ". No entanto, isso não lhe dará um controle refinado, pois colorirá todo o prompt. Também tenha cuidado, pois exibe a senha em texto não criptografado.

Aurélien Derouineau
fonte
Isso está desatualizado. Há uma série de valores possíveis para a opção prompt. Veja aqui: dev.mysql.com/doc/refman/5.6/en/mysql-commands.html
Irongaze.com
resultado para mim no stack-over-flow
Shakiba Moshiri 13/10
Não é tão desatualizado como errado. por um lado, as seqüências de escape ANSI são algo totalmente independente do MySQL e, por outro, elas certamente podem ser usadas, como amplamente demonstrado nas outras respostas aqui.
29418 Jeff