5 советов для работы с историей в Bash






Говорят что те, кто не помнит историю, обречены вновь и вновь повторять одно и то же. А если вы не умеете пользоваться историей в Bash, то вы не сможете использовать мощь вашей системы в полном объёме. Однако, начать никогда не поздно и возможно, прочитав эту заметку, вы откроете для себя несколько полезных и нужных в повседневной работе навыков работы с GNU Bash.


Если вы проводите какое-то количество времени в оболочке, то скорее всего знаете о том, что существует «история» команд, которые вы выполняли, аналогично тому, как ваш веб-браузер помнит историю посещённых вами веб-страниц. Хотя, конечно, история команд в оболочках появилась гораздо раньше истории посещённых страниц в браузерах.

Многие пользователи знают о том, что доступ к истории команд можно получить при помощи команды history или же при помощи клавиатурных комбинаций Ctrl+p (предыдущая команда) и Ctrl+n (следующая команда). Это очень полезные и часто используемые приёмы работы с историей, однако при помощи них не задействуете все возможности Bash для работы с историей. Давайте рассмотрим несколько трюков работы с историей Bash, пользуясь командой history или другими способами.

Использование номеров

Если вы дадите команду history, вы получите список последних введённых команд с порядковым номером перед каждой из них. Вы можете повторно запустить любую команду из истории при помощи конструкции

где n — номер записи в истории. То есть, например, инструкция

выполнит пятидесятую команду из истории. Также вы можете использовать конструкцию

если вам нужно выполнить n-ю по счёту команду, начиная с конца списка. Например, ваш вывод history выглядит так:

тогда инструкция

запустит команду sudo su.

Вызов последней команды

Как часто вы вводите какую-то команду, а затем видите, что вы, намереваясь предварить её sudo, забыли это сделать? У меня такое происходит постоянно. Можно исправить это, вернувшись к последней команде при помощи клавиши «стрелка вверх» или при помощи комбинации Ctrl+p, затем, перейдя в начало строки при помощи клавиши Home или Ctrl+a вписать пропущенное sudo. Есть и более простой способ:

Это запустит последнюю команду (!!) при помощи sudo. Неплохо?

Вы, вероятно, знаете конструкцию !command, которая запустит последнюю команду из истории, которая начинается с command. Таким образом, если вы недавно запускали очень длинную команду и помните с чего она начиналась, такой способ запуска из истории может вам пригодиться. А знаете ли вы, что Bash  в этом случае ищет не команду, а ищет подстроку? То есть, вам не нужно после восклицательного знака вписывать всю команду целиком, достаточно лишь первых символов. Допустим, вы запускали что-то вроде:

Многие пользователи введут

чтобы повторить команду, однако зачатую вполне достаточно выполнить

конечно же, при условии, что после искомой команды вы больше не выполняли команд, начинающихся с «g».

Если вам вдруг понадобится выполнить поиск не сначала строки, а в любой её части, воспользуйтесь конструкцией «!?string?». Например:

Вызов последнего параметра команды

Используя комбинацию «Esc+.» (Escape с точкой), вы можете вызывать из истории последнее слово, переданное команде в качестве аргумента. Например, вы запускали:

Теперь, если вы нажмёте «Esc+.», то вы получите «filename2». Попробуйте самостоятельно поиграть с этой функцией — очень полезная штука!

А что, если вам нужно не последнее слово, а скажем, второе? Или вообще все? Например, у вас в истории есть команда:

и вам понадобилось вытащить два слова из середины? Легко!

Если же вам вдруг понадобились вообще все аргументы, переданные команде, вы можете воспользоваться такой конструкцией:

Поиск

Ещё одна полезная функция — это поиск при помощи «Ctrl+r». Нажмите «Ctrl+r» и в появившемся приглашении начните вводить часть какой-нибудь ранее ведённой команды. По мере ввода символов Bash будет пытаться найти в истории последнюю команду, содержащую указанные вами символы. После того, как найдёте, можете начать «Ctrl+r» ещё раз и Bash выведет более раннюю команду, если таковая имеется. После того, как вы отыщете нужную команду, просто нажмите «Enter» и она появится в вашей командной строке.

Если вам необходимо отредактировать команду, прежде чем запускать, воспользуйтесь традиционными «стрелкой влево» и «стрелкой вправо», чтобы переместить курсор в нужное место команды для исправления.

Безопасность

История команд очень полезная штука, однако иногда бывают ситуации, когда нежелательно, чтобы она сохранялась. Например, вы используете для работы разделяемую между многими пользователями систему и не хотите, чтобы системные администраторы системы выдели какие команды вы вводили. Даже если вы пользуетесь личным компьютером, всегда есть шанс, что он будет взломан и вам хотелось бы не хранить в истории действительно важные данные. В конце-концов вы можете захотеть не захламлять историю какими-то командами, поскольку в их хранении просто нет смысла. Например, вы можете часто пользоваться ls, однако зачем хранить её в истории, вместо того, чтобы хранить в ней только длинные и действительно полезные с точки зрения хранения команды?

Давайте посмотрим, каким способом можно управлять хранением команд в истории.

Первый способ — это определить в .bashrc переменную окружения со следующим значением:

Опция ignorespace заставляет Bash игнорировать команды, начинающиеся с пробела. Если вам нужно, чтобы Bash не сохранил в истории команду, содержащую секретную информацию — просто предварите её пробелом.

Опция ingoredups исключает хранение в истории дубликатов команд, что часто помогает значительно разгрузить историю команд.

Вообще, некоторые дистрибутивы «из коробки» имеют эти опции установленными. Если это не ваш случай — просто добавьте строку в ваш ~/.bashrc.

Вы также можете заставить Bash игнорировать некоторые команды. Допустим, вы не хотите хранить в истории команды, содержащие имя какого-нибудь сервера. Просто определите значение переменной окружения HISTIGNORE и можете чувствовать себя спокойно:

Да, по поводу «спокойствия». На разделяемых системах некоторые пользователи могут видеть команды, запущенные вами при помощи утилит top и ps. Поэтому, если вы не уверены на 100% в надёжности системы, с которой работаете — не стоит запускать там какие бы то ни было команды, содержащие секретные данные.

Заключение

Очень надеюсь, что рассмотренные здесь приёмы пригодятся вам в повседневной работе и сделают её выполнение чуточку приятнее. Однако, это далеко не всё. Обязательно посмотрите man-страницу по history в вашей системе. Уверен, вы сможете найти для себя ещё массу полезного!

Источник linux.com




5 советов для работы с историей в Bash: 6 комментариев

  1. > комбинация «Esc+.»

    Всё же это не комбинация, а последовательное нажатие двух клавиш (нажать Esc, отпустить Esc, нажать точку, отпустить точку).

    А есть комбинация «Alt+.», которая делает то же самое, но может быть недоступна из-за ограничений терминала, как, например, под MacOSX.

    Спасибо про «:n-m», давно хотел.

  2. Для подстановки последнего аргумента предыдущей команды вместо Esc+. удобнее использовать Alt+.

    Также эту функцию может выполнить переменная $_

  3. Бывает удобно проверять всякие !! табом перед тем, как перечитать ещё разик и нажать энтер (по крайней мере в zsh).

  4. !$ — последний аргумент предыдущей команды

    !^ — первый аргумент предыдущей команды

    $ cp file1 file2

    $ ls !$

    ls file2

    file2

    $ cp file1 file2

    $ ls !^

    ls file1

    file1

    Спасибо, «:n-m» действительно не хватало.

Комментарии запрещены.