Здрасти. Если открыть два терминала, в первом ввести команду ls -la, а во втором history, то во втором терминале ты не увидишь в истории команду ls -la.

Хотя сервер один и тот же. И не увидишь ты эту команду в истории, пока не завершишь сессию в первом терминале либо не сделаешь определённый финт ушами. Пиздец неудобно!

Финт ушами в первом терминале:

history -a
history -c
history -r

a = пишем текущую историю сессии в файл
с = очищаем текущую сессию
r = перезагружаем файл истории

Теперь, если перезайти во второй терминал, то увидишь там команду ls -la, то есть история как бы синхронизировалась. Это хорошо, но недостаточно хорошо!

Как это можно автоматизировать?

Добавляем в .bashrc:

HISTCONTROL=ignoredups:erasedups
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

ignoredups:erasedups

  1. Команды, вводимые несколько раз, не дублируются в истории.
  2. Повторная команда заменяет все предыдущие в истории.

shopt -s histappend

Эта команда включает опцию histappend, которая добавляет новые команды в конец файла истории (~/.bash_history) при завершении сессии вместо перезаписи файла. Это позволяет сохранить команды из разных сессий и объединить их в единую историю.

А кишка PROMPT_COMMAND = назначает значение переменной PROMPT_COMMAND, которая используется в bash для выполнения команды перед отображением командной строки (приглашения).

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Теперь твоя история команд будет автоматически синхронизирована с файлом истории. Это полезно, если ты работаешь с несколькими терминалами и хочешь иметь актуальную историю без хуйни.

А ещё есть фича:

declare -r PROMPT_COMMAND="echo 'привет осёл'"

После выполнения любой команды на экран будет выводиться «привет осёл». Эту команду можно заменить на любую другую, например триггерить bash-скрипт, который будет отправлять введённые команды сразу тебе в телеграм. Ну или забить exit 1 по приколу.

Ёмко? Ёмко! Изучай!