Использование номеров
Если вы дадите команду
history, вы получите список последних
введённых команд с порядковым номером перед каждой из них. Вы можете
повторно запустить любую команду из истории при помощи конструкции
где
n — номер записи в истории. То есть, например, инструкция
выполнит пятидесятую команду из истории. Также вы можете использовать конструкцию
если вам нужно выполнить
n-ю по счёту команду, начиная с конца списка. Например, ваш вывод
history выглядит так:
|
1 sudo su
2 exit
3 sudo apt-get update
|
тогда команда !1
запустит команду
sudo su.
Вызов последней команды
Как часто вы вводите какую-то команду, а затем видите, что вы, намереваясь предварить её
sudo, забыли это сделать? У меня такое происходит постоянно. Можно исправить это, вернувшись к последней команде при помощи клавиши
«стрелка вверх» или при помощи комбинации
Ctrl+p, затем, перейдя в начало строки при помощи клавиши
Home или
Ctrl+a вписать пропущенное sudo. Есть и более простой способ:
Это запустит последнюю команду (
!!) при помощи
sudo. Неплохо?
Вы, вероятно, знаете конструкцию
!command, которая запустит последнюю команду из истории, которая начинается с
command.
Таким образом, если вы недавно запускали очень длинную команду и
помните с чего она начиналась, такой способ запуска из истории может вам
пригодиться. А знаете ли вы, что Bash в этом случае ищет не команду, а
ищет
подстроку? То есть, вам не нужно после восклицательного
знака вписывать всю команду целиком, достаточно лишь первых символов.
Допустим, вы запускали что-то вроде:
|
$ git commit -a -m "Various and sundry notes"
|
Многие пользователи введут
чтобы повторить команду, однако зачатую вполне достаточно выполнить
конечно же, при условии, что после искомой команды вы больше не выполняли команд, начинающихся с
«g».
Если вам вдруг понадобится выполнить поиск не сначала строки, а в любой её части, воспользуйтесь конструкцией
«!?string?». Например:
Вызов последнего параметра команды
Используя комбинацию
«Esc+.» (
Escape с точкой), вы можете вызывать из истории последнее
слово, переданное команде в качестве аргумента. Например, вы запускали:
Теперь, если вы нажмёте
«Esc+.», то вы получите
«filename2». Попробуйте самостоятельно поиграть с этой функцией — очень полезная штука!
А что, если вам нужно не последнее слово, а скажем, второе? Или вообще все? Например, у вас в истории есть команда:
|
$ ls file1.txt file2.txt file3.txt file4.txt
|
и вам понадобилось вытащить два слова из середины? Легко!
Если же вам вдруг понадобились вообще все аргументы, переданные команде, вы можете воспользоваться такой конструкцией:
Поиск
Ещё одна полезная функция — это поиск при помощи
«Ctrl+r». Нажмите
«Ctrl+r»
и в появившемся приглашении начните вводить часть какой-нибудь ранее
ведённой команды. По мере ввода символов Bash будет пытаться найти в
истории последнюю команду, содержащую указанные вами символы. После
того, как найдёте, можете начать
«Ctrl+r» ещё раз и Bash выведет более раннюю команду, если таковая имеется. После того, как вы отыщете нужную команду, просто нажмите
«Enter» и она появится в вашей командной строке.
Если вам необходимо отредактировать команду, прежде чем запускать,
воспользуйтесь традиционными «стрелкой влево» и «стрелкой вправо», чтобы
переместить курсор в нужное место команды для исправления.
Безопасность
История команд очень полезная штука, однако иногда бывают ситуации,
когда нежелательно, чтобы она сохранялась. Например, вы используете для
работы разделяемую между многими пользователями систему и не хотите,
чтобы системные администраторы системы выдели какие команды вы вводили.
Даже если вы пользуетесь личным компьютером, всегда есть шанс, что он
будет взломан и вам хотелось бы не хранить в истории действительно
важные данные. В конце-концов вы можете захотеть не захламлять историю
какими-то командами, поскольку в их хранении просто нет смысла.
Например, вы можете часто пользоваться
ls, однако зачем хранить
её в истории, вместо того, чтобы хранить в ней только длинные и
действительно полезные с точки зрения хранения команды?
Давайте посмотрим, каким способом можно управлять хранением команд в истории.
Первый способ — это определить в
.bashrc переменную окружения со следующим значением:
|
HISTCONTROL=ignorespace:ignoredups
|
Опция
ignorespace заставляет Bash игнорировать команды,
начинающиеся с пробела. Если вам нужно, чтобы Bash не сохранил в истории
команду, содержащую секретную информацию — просто предварите её
пробелом.
Опция
ingoredups исключает хранение в истории дубликатов команд, что часто помогает значительно разгрузить историю команд.
Вообще, некоторые дистрибутивы «из коробки» имеют эти опции
установленными. Если это не ваш случай — просто добавьте строку в ваш
~/.bashrc.
Вы также можете заставить Bash игнорировать некоторые команды.
Допустим, вы не хотите хранить в истории команды, содержащие имя
какого-нибудь сервера. Просто определите значение переменной окружения
HISTIGNORE и можете чувствовать себя спокойно:
Да, по поводу «спокойствия». На разделяемых системах некоторые
пользователи могут видеть команды, запущенные вами при помощи утилит
top и
ps.
Поэтому, если вы не уверены на 100% в надёжности системы, с которой
работаете — не стоит запускать там какие бы то ни было команды,
содержащие секретные данные.