readline команды (MySQL, bash, rlwrap)

Данная статейка уже носит чисто профессиональный характер — она для тех, кто работает в Unix и работает в bash, tcsh шеллах, а также работает с MySQL. Сейчас я расскажу о нескольких очень полезных «горячих» клавишах для работы в командной строке.

Если вы работаете раз от разу в bash, tcsh и других shell-ах, вы можете не знать про следующие, но очень удобные команды, которые облегчать вам жизнь под Unix:

  • Ctrl + A — переход в начало текущей строки;
  • Ctrl + E — переход в конец текущей строки;
  • Стрелка вверх / Стрелка вниз хождение по history командам соответственно к более старым командам / к более новым (это вы навярняка знаете)
  • Ctrl + Uстирает все слева от текущей позиции курсора, то есть чтобы быстро очистить строку, можно сделать Ctrl + E и затем Ctrl + U
  • Esc -> d — стирает слово справа (сначала нажимаем Esc, отпускаем, затем ‘d’)
  • Tab — формирует законченный вид не до конца набранной команды, файла или директории. Для MySQL —  еще таблицы, имени колонки. Если нет однозначности, то после повторного нажатия Tab выдаются варианты. Очень ускоряет процесс работы в командной строке, если вы не знали про это 😉
  • Ctrl + PageDown — переход к самой последней (свежей) команде в history
  • Ctrl + PageUp — переход к самой старой (первой) команде history
  • Ctrl + R — самая ценная команда для меня — поиск в history. Делается так: нажимаем Ctrl + R, появляется приглашение ввести подстроку поиска ( (reverse-i-search)`’: ), далее мы вводим, например, «mysql» — видим самую последнюю команду shell-а, где встречалось подстрока «mysql». Если она нас не устраивает, то для повтора поиска тут же надо снова нажать Ctrl + R. Каждое нажатие Ctrl + R перемещает нас к более старым командам с подстрокой «mysql», которые мы когда либо исполняли. Если же нас найденная команда устраивает, нажимаем «Стрелка вправо» или «Стрелка влево» и приступаем к редактированию и исполнению команды. Это очень удобная и нужная команда!

Все эти команды — подмножество команд библиотеки readline (man 3 readline). Ее используют и другие программы, например MySQL. Но в MySQL есть то ли баг, то ли так задумано разработчиками. Суть ее в том, что MySQL версий 3.x, например, прекрасно исполнял команду поиска (Ctrl + R), но потом, по каким то причинам, новые релизы — MySQL 4.x & 5.x перестали работать с поиском. Скорее всего, это связано с тем, что раньше MySQL использовал readline библиотеку, но потом разработчики перешли на editline. И последняя перестала работать с поиском. Я долго мучался, пока не нашел решение. Оно следующее:

Создать файл ~/.editrc — конфиг для editline. Там мы пишем следующие строки:

bind "\e[3~" ed-delete-next-char
bind "^R" em-inc-search-prev

После этого в MySQL 4.x & 5.x у нас будет работать Ctrl + R.

Другим решением для MySQL вместо редактирования .editrc будет использовать rlwrap программу (установка в Linux Fedora Core, например, такая: yum install rlwrap) — она «обертывает» stdout запускаемой программы и создает history для вводимых строк (хранит в ~/.commandname_history). У нее есть некоторые недостатки — на ввод паролей она делает echo, то есть пароль будет виден на экране. Можно с помощью опций отключить это, но это не идеально. Зато можно в нее обернуть любую программу, которая даже не имеет history вообще (rlwrap perl -MCPAN -e shell , например). Итак, второе решение для MySQL может быть таким:

alias mysql=’rlwrap -a mysql’

Это ставиться в ~/.bashrc, например. Или вместо алиаса можно просто запустить:

rlwrap -a mysql -uroot -p mysql

Man на rlwrap вы можете найти на сайте разработчика.

Вот такие вот тонкости, которые на 100% облегчат вам работу в Unix.

readline команды (MySQL, bash, rlwrap): 2 комментария

  1. А еще есть «!» который работает примерно как Ctrl+R
    > find …………
    > ls
    > !find
    правда это проверено на csh/tcsh, bash не использую.

  2. Проверил, тоже работает (в bash). Только очень примитивно — исполняет последнюю команду в history, где есть эта подстрока. Но возможности поискать и увидеть, что будет исполняться — нет. Так можно случайно исполнить и не то, что надо 😉

Обсуждение закрыто.