Bash history: как Linux помнит ваши команды

Есть у людей такая черта, мы всегда всё забываем. Команды, пароли, даже то, что ели на завтрак. А скромный, но умный Linux помнит всё. И делает это не ради шпионажа, а чтобы вы, дорогие пользователи, могли работать быстрее и меньше страдать от собственной забывчивости. Всё это благодаря одной простой, но гениальной штуке — bash history.

Я уверен, у каждого, кто хоть раз открывал терминал, был момент, когда нужно было повторить команду, но мозг выдал ошибку 404: «Команда не найдена». И вот тогда на помощь приходит история команд Linux. Нажимаешь стрелку вверх — и как будто пролистываешь прошлое. Каждый «sudo apt install», каждый неудачный «rm» — всё как на ладони.

Иногда кажется, что bash history (история команд) – это как дневник системного администратора. Местами неловкий, местами смешной, но всегда правдивый. И да, иногда страшно представить, что кто-то другой может его прочитать.

История команд bash
История команд bash

Как мы вообще до этого дошли

История команд (bash history) – идея не новая. Ещё в 80-х инженеры Unix поняли, что человек это ленивое существо. И если его заставить набирать одну и ту же команду десять раз, он или уйдёт в Windows, или придумает автоматизацию. Так появилась возможность хранить историю команд — сначала просто в памяти, потом в отдельном файле. В Linux это файл ~/.bash_history.

По сути, это обычный текстовый файл. Если вы его откроете, то увидите список всех команд, что вводили. Можно даже пролистать и поностальгировать. Вот вы устанавливали Apache, вот ковырялись с Docker, а вот забыли кавычку и сломали скрипт. История честно хранит всё, даже ваши ошибки. Особенно ошибки.

Когда я впервые увидел этот файл, у меня было странное чувство, как будто я подглядываю за самим собой. Каждая строчка это кусочек какого-то рабочего дня. Где-то видно, что торопился («sudo !!» — классика), где-то видно, что отчаянно искал решение («grep», «awk», «sed», «grep», «grep»…). И знаете, в этом что-то очень человеческое.

Кто вообще пользуется этой историей?

Если вы разработчик, админ или просто человек, который любит «пощупать» систему руками, то bash history для вас как шпаргалка. Особенно когда всё идёт не по плану. Иногда нужно вспомнить, что именно вы запускали до того, как сервер перестал отвечать. Иногда просто лень набирать заново длинный путь или сложный набор опций. А иногда хочется понять, кто вообще влез в систему и что делал. Соответственно тут история становится инструментом расследования.

Есть даже забавный феномен: опытные админы могут многое сказать о человеке, просто глядя на его bash history (историю команд). Как он думает, насколько аккуратен, умеет ли пользоваться пайпами, склонен ли к импровизации. В этом смысле история команд почти как почерк.

Где живёт история команд в Linux

По умолчанию Bash хранит последние тысячу команд в памяти и две тысячи в файле. Это можно изменить, прописав в .bashrc переменные HISTSIZE и HISTFILESIZE. Многие увеличивают лимиты, просто потому что история никогда не бывает слишком длинной. Она как журнал логов, только про нас самих.

Но есть один нюанс. Если у вас открыто несколько терминалов, история не синхронизируется между ними. В одном окне вы набрали десять команд, а в другом пять и они живут своей жизнью, пока вы не выйдете. Потом Bash объединяет их при записи в файл. И вот тут начинается путаница.

Когда я об этом впервые узнал, подумал: «Господи, так вот почему я не вижу то, что только что запускал в другом окне!» Решается всё просто требуется просто добавить строку:

PROMPT_COMMAND='history -a'

Теперь команды записываются сразу после выполнения. Мелочь, но экономит нервы.

Как смотреть и искать команды в bash history

Чтобы увидеть историю, достаточно набрать history. Появится список с номерами, как очередь в поликлинике. Каждая команда пронумерована, и можно обратиться к любой из них через !номер. Например, !15 выполнит пятнадцатую команду из списка. Быстро, но опасно, если не помните, что там было под номером 15. Иногда это сюрприз, не всегда приятный.

Можно фильтровать историю через grep, например:

history | grep cd

Как смотреть и искать команды в bash history
Как смотреть и искать команды в bash history

Теперь вы увидите все команды, где встречается слово «cd». Удобно, когда пытаешься вспомнить в какую папку ты что-то засунул месяц назад. Ну или как ты удалил нужный файл.

А если хочется всё стереть в bash history

Иногда наступает момент, когда историю хочется обнулить. Не потому что скрываешь что-то страшное, а просто чтобы начать с чистого листа. Для этого есть команда history -c . Она очищает историю в текущей сессии. А чтобы стереть файл целиком, можно использовать старый трюк:

cat /dev/null > ~/.bash_history

Да, именно так. Всё отправляется в бездну /dev/null, где вещи исчезают навсегда. Правда, стоит помнить, что стертая история это как стертая память. Иногда именно в ней хранилось решение вашей будущей проблемы.

Настройки, о которых мало кто знает

Всё, что делает Bash, можно настроить. В том числе и то, как он ведёт историю. Например, можно сделать так, чтобы команды с пробелом в начале не сохранялись. Очень полезно, если не хотите, чтобы кто-то увидел в истории ваш случайный «ssh root@server -p22» или команду с паролем. Для этого есть переменная HISTCONTROL. Если в ней указать ignorespace или ignoreboth, то команды с пробелом в начале просто пропускаются.

Есть ещё HISTIGNORE, эта команда позволяет задать шаблоны команд, которые не будут сохраняться. Например:

HISTIGNORE='sudo *:ls:exit'

Теперь все «sudo», «ls» и «exit» не попадут в историю. Мелочь, а приятно. Так история становится чище и полезнее, только нужные для вас команды, без мусора.

Хронология событий: как добавить время к каждой команде в bash history

Иногда хочется понять не только что делал, но и когда. Например, если отлаживаете скрипт, который внезапно перестал работать вчера вечером. Для этого в .bashrc можно добавить:

HISTTIMEFORMAT="%F %T "

Теперь каждая команда будет иметь временную метку в формате «год-месяц-день часы:минуты:секунды». Очень помогает, когда пытаешься реконструировать цепочку событий. Очень полезная вещь, которая поможет вычислить, например, что виноват не cron, а вы сами, просто запустив задачу вручную дважды. История 100% не соврет.

Восклицательные чудеса: расширения истории

Самое весёлое начинается, когда узнаёшь о «восклицательных» командах. Например, !! — повторяет последнюю команду. Все, кто хоть раз забывал добавить «sudo» перед установкой, знают этот трюк: ввёл apt install → получил «Permission denied» → пишешь sudo !! и магия.

Можно выполнять не последнюю, а любую команду по номеру (!23), или по ключевому слову. !grep запустит последнюю команду, начинавшуюся с grep. Удобно, но осторожно, можно например случайно удалить лог, который хотите просто посмотреть. Всегда проверяйте через команду !:p . !:p отобразит команду, не выполняя её.

Есть и более хитрые штуки: ^ошибка^исправление^ заменяет кусок текста в предыдущей команде. Если написали «wrong» вместо «right», можно просто исправить без переписывания. Bash, по сути, даёт вам «редактировать прошлое». Как доктор Стрэндж, только в терминале.

Другая полезная фича — дизайнаторы. Это специальные символы, которые вытягивают аргументы из предыдущих команд. Например:

  • !:$ — последний аргумент;
  • !:1 — первый аргумент;
  • !:* — все аргументы.

Сценарий из жизни: вы копируете файл «scp data.txt user@server:/tmp», потом хотите зайти туда через ssh. Пишете ssh user@server? Нет! Просто ssh !:$ — и всё. Bash подставит последний аргумент, то есть адрес сервера. Гениально просто.

Почему это важно для всех, а не только для гиков

Можно подумать, что вся эта возня с bash history это удел зануд. Но если вдуматься, это про всех нас. Мы все работаем с историями браузеров, документов, чатов. Мы всё время возвращаемся, чтобы вспомнить, что делали. Bash history просто более честный и прозрачный вариант этой человеческой привычки. Без эмоций, без оценок, просто факты.

А ещё это напоминание о том, как важно документировать свои действия. Ведь если вы не записали, что делали, вы забудете. А Bash делает это за вас. Невидимо, но надёжно. И иногда именно это спасает.

Советы напоследок

  • Не игнорируйте историю. Настройте её под себя. Добавьте таймштампы, фильтры, увеличьте размер. Это займёт 5 минут, а поможет десятки раз.
  • Не ленитесь использовать Ctrl+R. Это ваш телепорт в прошлое. Пару клавиш и команда найдена.
  • Не храните секреты. Не вводите пароли в чистом виде. История всё помнит, даже если вы нет.
  • И не бойтесь ошибок. Bash history создана именно для того, чтобы из них учиться.

Вместо заключения

Иногда я думаю: если бы у жизни была такая же история, как у Bash, сколько всего можно было бы понять и исправить. Где ошибся, где всё сделал правильно, где стоило нажать стрелку вверх и не изобретать велосипед. Но у нас такой роскоши нет, а у Linux есть. И, честно говоря, это одна из причин, почему я люблю эту систему.

Bash history (история команд) это не просто список команд. Это следы нашего мышления, наших привычек и решений. Она не критикует, не учит, просто хранит. А когда надо бытро подсказывает. Может быть, именно поэтому люди и техника всё-таки уживаются: у нас общая слабость память.

Понравилась статья?

Помогите Setiwik.ru создавать больше глубоких обзоров и новостей. Один клик — и ваш вклад помогает держать серверы включёнными и авторов мотивированными!

Спасибо, что вы с нами!

Nazario
Nazario

Я — Nazario, тот самый человек, который больше десяти лет ковыряется в Linux и Windows системах не ради хобби, а потому что это — работа и жизнь. Всё, что вы читаете на Setiwik.ru, — это не пересказ справки из мануала, а результат десятков реальных кейсов, выстраданных конфигов и ночных перезагрузок.

Я не претендую на истину в последней инстанции. Но если мой опыт может кому-то упростить работу — значит, всё это не зря. Здесь нет «магии», только практика: от настроек сервера до неожиданных багов, которые не гуглятся с первого раза.

Setiwik.ru — это место, где IT становится чуть менее хаотичным. Заходите почаще — будем разбираться вместе.

Добавить комментарий