Console MySQL: Ctrl + C me rend fou

24

Il y a quelque chose dans la console MySQL qui me rend fou. Lorsque j'appuie sur ctrl+ cpour annuler la commande en cours de saisie, le terminal se ferme.

Dans tous les terminaux que je connais ( *nixbornes, Python, PostgreSQL), ctrl+ cannule la commande en cours et ctrl+ dsort du terminal.

Ce problème a été signalé en 2003 et a été signalé plusieurs fois depuis.

Existe-t-il un moyen de:

  • Modifiez ce comportement, ou
  • Convaincre l'équipe de développement MySQL que c'est vraiment ennuyeux?
Adam Matan
la source

Réponses:

6

Pour changer le comportement, téléchargez la source de la CLI mysql et modifiez le SIGINTgestionnaire pour qu'il se comporte comme bon vous semble, puis recompilez et installez.

Philᵀᴹ
la source
1
N'est-ce pas potentiellement dangereux? Il n'y a aucune garantie que cela fonctionnerait pour les futures versions. De plus , il semble que cela fonctionnerait, mais comment sauriez-vous que vous n'obtiendrez pas un comportement étrange dans un endroit totalement indépendant plus tard?
Pacerier
21

Au moins la version 5.6.14 du client a l' option --sigint-ignore pour ignorer totalement le gestionnaire SIGINT. Il semble avoir été ajouté le 7 octobre 2004 - donc cela fait au moins un moment. Je viens de le tester et cela empêche CTRL-C d'annuler le client MySQL. Cependant, il serait bien que CTRL-C annule également le tampon de ligne de commande actuel comme il le fait sur le shell BASH - comme le fait la CLI PostgreSQL. J'ai forké MySQL afin de voir à quel point il serait difficile d'implémenter une telle chose. Je posterai une formule Homebrew avec un lien tarball quand / si c'est prêt.

MISE À JOUR 1 Avez-vous déjà eu un de ces jours? J'ai créé le patch promis , puis j'ai décidé de créer une vidéo pour le démontrer. Ça a marché! Cependant, je ne pouvais pas le désactiver! Eh bien, il s'avère que MySQL a réellement intégré la fonctionnalité au client principal l'année dernière ! Oui, le A de ce Q est de télécharger au moins le client de MySQL 5.7.3-794-g901d27f. Il a les fonctionnalités que nous souhaitions tous.

EXEMPLE Depuis la ligne de commande, ajoutez simplement l'indicateur --sigint-ignore:

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

Ou, faites comme je l'ai fait et créez un fichier de configuration MySQL pour votre compte d'utilisateur sur $HOME/.my.cnf( %USERPROFILE%/.my.cnfsous Windows) avec le contenu suivant:

[mysql]
sigint-ignore=TRUE

Cela garantira que toutes les mysqlexécutions ignorent le Ctrl-C ennuyeux et se comportent comme un bon client SQL.

akutz
la source
19

Bien que le comportement ctrl+ csoit ennuyeux, vous pouvez toujours utiliser \cpour annuler la requête actuelle. Il vous suffit de vous entraîner que lorsque vous utilisez mysql CLI, vous utilisez \cau lieu de ctrl+ c!

Derek Downey
la source
1
Qui est le gars qui a eu cette idée? Nous voulons sa tête.
Pacerier
1
Vous pouvez également utiliser Ctrl + U pour supprimer au début de la ligne et Ctrl + W pour supprimer un mot en arrière.
Damien Ó Ceallaigh
9

Bonne nouvelle: la fonctionnalité ^ C de MySQL a finalement été corrigée par # 66583 .

Du changelog 5.7.0 :

Auparavant, Control + C dans mysql interrompait l'instruction en cours s'il y en avait une, ou quittait mysql dans le cas contraire. Maintenant, Ctrl + C interrompt l'instruction en cours s'il y en avait une, ou annule toute ligne d'entrée partielle sinon, mais ne se ferme pas.

Damien Ó Ceallaigh
la source
J'utilise 5.6.35 et j'ai vérifié que ce n'était pas un problème.
flow2k
1

Quelle version du client utilisez-vous? Je me souviens que c'était le comportement le plus ancien, mais les versions récentes de 5.1 et 5.5 semblent simplement annuler la commande en cours sans quitter le client. Là encore, il se peut que j'utilise les versions de Percona. Vous pouvez essayer d'exécuter simplement leur client si c'est le cas.

atxdba
la source
hmm, je lance 5.5 Percona et ctrl + c abandonne toujours le client mysql (pas la commande sql actuelle)
Derek Downey
Je pense que j'ai mal lu l'OP. Ma réponse concernait une commande qui était en cours d'exécution, pas le désir de vous effacer une commande encore à exécuter.
atxdba
Je suis d'accord avec @atxdba - J'exécute également la version Percona de 5.5, et ctrl + c abandonne la commande en cours d'exécution. S'il n'y a aucune commande en cours d'exécution, elle abandonne l'interface CLI. Il se peut que ctrl + d tombe d'un shell en cours d'exécution, mais si vous avez un script en cours d'exécution dans le shell, cela s'arrêtera si vous appuyez sur ctrl + c ... différentes commandes pour différentes applications / shells / scripts! Peut être déroutant ...: ~ s
Dave Rix
@DaveRix Je suis d'accord aussi, ctrl + c sort d'une requête en cours d'exécution. Mais ce n'est pas le sujet du PO malheureusement.
Derek Downey