Consola MySQL: Ctrl + C me vuelve loco

24

Hay algo en la consola de MySQL que me vuelve loco. Cuando presiono ctrl+ cpara cancelar el comando actual que se está escribiendo, el terminal se cierra.

En cada terminal de know I ( *nixterminales, Python, PostgreSQL), ctrl+ ccancela el comando actual y ctrl+ dsale de la terminal.

Este problema ha sido reportado en 2003 , y se ha visto afectado varias veces desde entonces.

¿Hay alguna manera de:

  • Cambiar este comportamiento, o
  • ¿Convencer al equipo de desarrollo de MySQL de que esto es realmente molesto?
Adam Matan
fuente

Respuestas:

6

Para cambiar el comportamiento, descargue la fuente de la CLI de mysql y modifique el SIGINTcontrolador para que se comporte como mejor le parezca, luego vuelva a compilar e instalar.

Philᵀᴹ
fuente
1
¿No es esto potencialmente peligroso? No hay garantía de que funcione para futuras versiones. Además , parece que funcionaría, pero ¿cómo podría saber que no obtendría un comportamiento extraño en un lugar totalmente ajeno más tarde?
Pacerier
21

Al menos la versión 5.6.14 del cliente tiene la opción --sigint-ignore para ignorar totalmente el controlador SIGINT. Parece que se agregó el 7 de octubre de 2004, por lo que ha estado alrededor por un tiempo al menos. Lo acabo de probar y evita que CTRL-C cancele el cliente MySQL. Sin embargo, sería bueno si CTRL-C también cancelara el búfer de línea de comando actual como lo hace en el shell BASH, como lo hace la CLI de PostgreSQL. Bifurqué MySQL para ver cuán difícil sería implementar algo así. Publicaré una fórmula Homebrew con un enlace tarball cuando esté listo.

ACTUALIZACIÓN 1 ¿Alguna vez has tenido uno de esos días? Creé el parche prometido , y luego decidí crear un video para demostrarlo. ¡Funcionó! ¡Sin embargo, no pude desactivarlo! Bueno, ¡resulta que MySQL realmente incorporó la funcionalidad al cliente central el año pasado ! Sí, la A de esta Q es descargar al menos el cliente MySQL 5.7.3-794-g901d27f. Tiene la funcionalidad que todos deseamos.

EJEMPLO Desde la línea de comando simplemente agregue el indicador --sigint-ignore:

mysql --host=127.0.0.1 --port=8900 --user=root -p --sigint-ignore DBNAME

O haga lo que hice y cree un archivo de configuración MySQL para su cuenta de usuario en $HOME/.my.cnf( %USERPROFILE%/.my.cnfen Windows) con el siguiente contenido:

[mysql]
sigint-ignore=TRUE

Esto asegurará que todas las mysqlejecuciones ignoren el molesto Ctrl-C y se comporten como un buen cliente SQL.

akutz
fuente
19

Si bien el comportamiento ctrl+ ces molesto, aún puede usarlo \cpara cancelar la consulta actual. ¡Solo tiene que entrenarse para que cuando use mysql CLI, use en \clugar de ctrl+ c!

Derek Downey
fuente
1
¿Quién es el tipo que se le ocurrió esta idea? Queremos su cabeza.
Pacerier
1
También puede usar Ctrl + U para eliminar al comienzo de la línea y Ctrl + W para eliminar una palabra hacia atrás.
Damien Ó Ceallaigh
9

Buenas noticias: la funcionalidad ^ C de MySQL finalmente ha sido arreglada por # 66583 .

Desde el registro de cambios 5.7.0 :

Anteriormente, Control + C en mysql interrumpía la declaración actual si había una, o salía de mysql si no. Ahora Control + C interrumpe la declaración actual si había una, o cancela cualquier línea de entrada parcial de lo contrario, pero no sale.

Damien Ó Ceallaigh
fuente
Estoy usando 5.6.35 y verifiqué que esto no es un problema.
flow2k
1

¿Qué versión del cliente estás usando? Recuerdo que este era el comportamiento anterior, pero las versiones recientes de 5.1 y 5.5 parecen cancelar el comando en ejecución sin salir del cliente. Por otra parte, puede ser que estoy usando las versiones de Percona. Podría intentar simplemente ejecutar su cliente si ese es el caso.

atxdba
fuente
hmm, estoy ejecutando 5.5 Percona y ctrl + c todavía aborta el cliente mysql (no el comando sql actual)
Derek Downey
Creo que leí mal el OP. Mi respuesta fue abordar un comando que estaba en medio de la ejecución, no el deseo de dejar en blanco un comando que aún no se ejecuta.
atxdba
Estoy de acuerdo con @atxdba: también estoy ejecutando la compilación Percona de 5.5, y ctrl + c se cae del comando que se está ejecutando actualmente. Si no se ejecuta ningún comando, se cae de la CLI. Puede ser que ctrl + d se caiga de un shell que se está ejecutando, pero si tiene un script ejecutándose dentro del shell, se detendrá si presiona ctrl + c ... ¡diferentes comandos para diferentes aplicaciones / shells / scripts! Puede ser confuso ...: ~ s
Dave Rix
@DaveRix También estoy de acuerdo, ctrl + c sale de una consulta que se está ejecutando actualmente. Pero desafortunadamente, de eso no se trataba el OP.
Derek Downey