Щоб зрозуміти поведінку історії баш-спочатку, ви повинні знати наступне:
- У файлі історії є історія.
- Існує історія в пам'яті баш-процесу.
- Історія в пам'яті одного bash-процесу не синхронізується з історією в пам'яті будь-якого іншого bash-процесу.
- Історія в пам'яті процесу bash не синхронізується з історією у файлі, якщо явно не запитується до або під час якоїсь конкретної події (див. Нижче).
Використовуючи налаштування за замовчуванням, життєвий цикл баш-сеансу щодо історії є таким:
- Під час запуску bash прочитає файл історії. Вміст файлу історії тепер знаходиться в пам'яті процесу bash.
- Під час звичайного використання обробляється лише історія пам'яті.
- Під час відключення історія в пам'яті записується у файл історії, перезаписуючи будь-який попередній вміст файла історії.
Здається, неспостережна поведінка, яку ви спостерігали, здебільшого пояснюється тим, що вміст файлу історії завжди є історією останнього закритого bash-сеансу, а bash читає файл історії лише під час запуску.
Прочитайте інструкцію bash для більш детального пояснення процесу запуску та відключення.
Зауважте, що під налаштуваннями за замовчуванням я маю на увазі параметри за замовчуванням від bash. Ваш дистрибутив, можливо, забезпечив .bashrc
(або /etc/bash.bashrc
), що змінить цю поведінку.
Увімкнувши опцію оболонки, histappend
ви можете сказати bash, щоб додати, а не перезаписувати файл історії. Можна ввімкнути histappend
використання команди shopt -s histappend
. Щоб ця опція завжди була включена, вам слід ввести команду у свій .bashrc
(або інший файл ініціалізації). Детальніше про shopt
команду читайте в посібнику з bash
Зауважте, що включення histappend
не значно зменшить, здавалося б, недетерміновану поведінку. Це тому, що кожен баш-сеанс все ще має власну історію в пам'яті. Можна мати в основному синхронізовану історію баш. Існує посібник, як отримати кожен процес bash, щоб мати історію синхронізованої історії в потоці під час переповнення стека .
за допомогою вбудованої команди history
ви можете явно сказати bash, щоб прочитати історію з файлу в пам'ять або записувати з пам'яті в файл. Наприклад: history -r
прочитає вміст файла і додасть його до історії в пам'яті. history -w
запише поточну історію з пам'яті у файл, перезаписуючи попередній вміст. Це в основному те, що відбувається під час відключення. Детальніше про history
команду читайте в посібнику з bash
Для повноти тут перелік внутрішніх змінних, які змінюють поведінку історії:
HISTFILE
: файл, з якого слід читати та записувати історію.
HISTFILESIZE
: максимальна кількість рядків для файлу історії.
HISTSIZE
: максимальна кількість рядків для історії в пам'яті.
HISTCONTROL
, HISTIGNORE
, HISTTIMEFORMAT
: Чи не має відношення до цієї дискусії. Детально прочитайте посібник з bash .