Konsola MySQL: Ctrl + C doprowadza mnie do szału

24

W konsoli MySQL jest coś, co doprowadza mnie do szału. Kiedy naciskam ctrl+, caby anulować wpisywanie bieżącego polecenia, terminal kończy działanie.

W każdym terminalu wiem ( *nixterminale, Python, PostgreSQL) ctrl+ canuluje bieżące polecenie i ctrl+ dwyjście terminal.

Ten problem został zgłoszony w 2003 r. I od tego czasu był kilkakrotnie zderzany.

Czy istnieje sposób na:

  • Zmień to zachowanie lub
  • Przekonać zespół programistów MySQL, że to naprawdę denerwujące?
Adam Matan
źródło

Odpowiedzi:

6

Aby zmienić zachowanie, pobierz źródło CLI mysql i zmodyfikuj SIGINTmoduł obsługi, aby zachowywał się tak, jak uważasz, a następnie ponownie skompiluj i zainstaluj.

Philᵀᴹ
źródło
1
Czy to nie jest potencjalnie niebezpieczne? Nie ma gwarancji, że zadziała w przyszłych wersjach. Dodatkowo wygląda na to, że zadziałałoby, ale skąd miałbyś wiedzieć, że nie dostaniesz jakiegoś dziwnego zachowania w zupełnie niezwiązanym miejscu?
Pacerier
21

Przynajmniej wersja 5.6.14 klienta ma opcję --sigint-ignore , aby całkowicie zignorować moduł obsługi SIGINT. Wygląda na to, że został dodany 7 października 2004 r. - więc minęło już trochę czasu. Właśnie go przetestowałem i powstrzymuje CTRL-C przed anulowaniem klienta MySQL. Byłoby jednak miło, gdyby CTRL-C anulował również bieżący bufor wiersza poleceń, jak ma to miejsce w powłoce BASH - podobnie jak CLI PostgreSQL. Rozwidliłem MySQL, aby zobaczyć, jak trudno byłoby zaimplementować coś takiego. Kiedy / jeśli będzie gotowy, opublikuję formułę Homebrew z linkiem do tarballa.

AKTUALIZACJA 1 Miałeś kiedyś jeden z tych dni? Stworzyłem obiecaną łatkę , a potem postanowiłem stworzyć film, aby to zademonstrować. Zadziałało! Jednak nie mogłem tego wyłączyć! Okazuje się, że MySQL faktycznie wyposażył tę funkcjonalność w głównego klienta w zeszłym roku ! Tak, od A do tego Q polega na pobraniu przynajmniej klienta MySQL 5.7.3-794-g901d27f. Ma funkcjonalność, której wszyscy pragnęliśmy.

PRZYKŁAD W wierszu polecenia po prostu dodaj flagę --sigint-ignore:

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

Lub zrób tak jak ja i utwórz plik konfiguracyjny MySQL dla swojego konta użytkownika w $HOME/.my.cnf( %USERPROFILE%/.my.cnfw systemie Windows) z następującą zawartością:

[mysql]
sigint-ignore=TRUE

Zapewni to, że wszystkie mysqlwykonania ignorują irytujące Ctrl-C i zachowują się jak dobry klient SQL.

akutz
źródło
19

Podczas gdy zachowanie ctrl+ cjest denerwujące, nadal możesz użyć \cdo anulowania bieżącego zapytania. Musisz po prostu nauczyć się, że korzystając z mysql CLI, używasz \czamiast ctrl+ c!

Derek Downey
źródło
1
Kim jest facet, który wpadł na ten pomysł? Chcemy jego głowy.
Pacerier,
1
Możesz także użyć Ctrl + U, aby usunąć do początku wiersza, a Ctrl + W, aby usunąć jedno słowo wstecz.
Damien Ó Ceallaigh,
9

Dobra wiadomość: funkcjonalność ^ C MySQL została w końcu naprawiona przez # 66583 .

Z dziennika zmian 5.7.0 :

Poprzednio Control + C w mysql przerywał bieżącą instrukcję, jeśli była, lub wychodził z mysql, jeśli nie. Teraz Control + C przerywa bieżącą instrukcję, jeśli taka istnieje, lub anuluje dowolną część wiersza wejściowego, ale nie wychodzi.

Damien - Ceallaigh
źródło
Używam 5.6.35 i sprawdziłem, że to nie problem.
flow2k
1

Jakiej wersji klienta używasz? Pamiętam, że było to starsze zachowanie, ale ostatnie wersje 5.1 i 5.5 wydają się po prostu anulować uruchomione polecenie bez wychodzenia z klienta. Z drugiej strony być może używam kompilacji Percona. W takim przypadku możesz spróbować uruchomić ich klienta.

atxdba
źródło
hmm, używam 5.5 Percona i ctrl + c nadal przerywa klienta mysql (nie bieżące polecenie sql)
Derek Downey
Chyba źle odczytałem OP. Moja odpowiedź dotyczyła komendy, która była właśnie wykonywana, a nie chęci, by cię zaślepić jeszcze do uruchomienia.
atxdba
Zgadzam się z @atxdba - uruchamiam również kompilację Percona 5.5, a ctrl + c wypada z aktualnie wykonywanego polecenia. Jeśli nie zostanie wykonane żadne polecenie, wypadnie ono z interfejsu CLI. Możliwe, że ctrl + d wypadnie z uruchomionej powłoki, ale jeśli masz skrypt działający w powłoce, przestanie to działać, jeśli naciśniesz ctrl + c ... różne polecenia dla różnych aplikacji / powłok / skryptów! Może być mylące ...: ~ s
Dave Rix
@DaveRix Ja też się zgadzam, ctrl + c wypada z aktualnie wykonywanego zapytania. Niestety nie o to chodziło w OP.
Derek Downey,