іноді команди історії не зберігаються в .bash_history


20

Я вчора видав багато команд у своєму CentOS 7. Але коли я хотів отримати ці команди сьогодні, я виявив, що запису немає. Коли я відкрив файл .bash_history, я ще не міг знайти команд, які я видав вчора, але кілька днів тому я знайшов багато старих команд. Чому останні команди не зберігалися? Як я можу збільшити потенціал історії?


Іноді, коли термінал аномально закритий, історія не зберігається, це траплялося і зі мною, але я не знаю обставин, які спричиняють таку поведінку
mazs

Відповіді:


11

Найімовірнішою причиною того, що елементи історії не відображаються, є не встановлення HISTFILEнічого або HISTSIZEнуля, це два рази увійти в одну машину і вийти з другого екземпляра bash (в якому ви зробили мало або нічого) після того, де ти багато зробив. За замовчуванням Bash не об'єднує історії, а другий вихід Bash замінює те, .bash_historyщо було так добре оновлено першим Bash-виходом.

Щоб цього не сталося, ви можете додати файл історії замість перезапису, можете скористатися параметром histappendоболонки:

Якщо параметр оболонки histappend увімкнено (див. Опис простріляного під командою SHELL BUILTIN COMMANDS нижче), рядки додаються до файлу історії, інакше файл історії буде перезаписаний.

Більш докладно в цій відповіді , включаючи , як використовувати HISTSIZE, HISTFILESIZEі HISTCONTROLконтролювати розмір, дублікати і т.д.


3

Для зміни історії використовувати розмір два BASH змінних HISTSIZE, HISTFILESIZE(зазвичай встановлюються в .bashrc).

Опис зі сторінки чоловіка BASH:

HISTSIZE Кількість команд, які слід запам'ятати в історії команд (див. ІСТОРІЯ нижче). Якщо значення дорівнює 0, команди не зберігаються у списку історії. Числові значення менше нуля призводять до того, що кожна команда зберігається у списку історії (немає обмежень). Оболонка встановлює значення за замовчуванням на 500 після читання будь-яких файлів запуску.

HISTFILESIZE Максимальна кількість рядків, що містяться у файлі історії. Коли цій змінній присвоюється значення, файл історії, якщо необхідно, обрізається, щоб містити не більше ніж кількість рядків, видаляючи найдавніші записи. Файл історії також прирізається до цього розміру після його запису при виході оболонки. Якщо значення дорівнює 0, файл історії обрізається до нульового розміру. Нечислові та числові значення менше нуля гальмують усічення. Оболонка встановлює за замовчуванням значення HISTSIZE після читання будь-яких файлів запуску.

Як приклад, у моєму .bashrcфайлі є така настройка :

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

1

У мене це сталося, але рішення тут не було зазначено. Причиною стала просто проста копія + випуск. Я копіював команду з іншого документа, і у мене було додаткове пробіл у буфері обміну. Чомусь це спричинило Ubuntu не зберігати команду у файл історії.

введіть тут опис зображення

Наведене вище зображення являло собою команду, яку я мав у своїй буфері обміну google docs. Ця команда виконувалась, але була пропущена з моєї історії. Я просто повернувся назад і вибрав команду без пробілів, а потім вона з’явилася в історії башів.


5
Один з варіантів історії - ігнорувати (не зберігати) рядки, які починаються з пробілу. Зазвичай це дефолт. Це можна змінити у вашому .bashrc.
студія

1

Переконайтеся, що для вашої HISTCONTROLзмінної середовища не встановлено значення ignorespaceабо ignoreboth.

$ echo $HISTCONTROL
ignoredups  #this is ok

Ви можете змінити його, встановивши значення у вашому ~/.bash_profileабо вашому ~/.profileфайлі:

HISTCONTROL=ignoredups

З bashчоловічої сторінки:

ІСТКОНТРОЛ

Список значень, розділених двокрапкою, керує тим, як команди зберігаються у списку історії.

Якщо список значень включає в себе ignorespace, рядки, які починаються з пробілу, не зберігаються у списку історії.

Значення ignoredupsпричин не призводить до збереження рядків, що відповідають попередньому запису історії.

Значення ignorebothскорочення для ignorespaceта ignoredups.

Значення erasedupsпризводить до того, що всі попередні рядки, що відповідають поточному рядку, будуть видалені зі списку історії, перш ніж цей рядок буде збережено.

Будь-яке значення, яке не є у наведеному вище списку, ігнорується.

Якщо значення HISTCONTROL не встановлено, або не містить дійсного значення, всі рядки, прочитані аналізатором оболонки, зберігаються у списку історії, залежно від значення HISTIGNORE. Другий і наступні рядки багаторядкової складної команди не перевіряються і додаються в історію незалежно від значення HISTCONTROL.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.