Як уникнути повторюваних записів у .bash_history


108

Та сама команда перерахована в моїй історії знову і знову. Як я можу цього уникнути? Я знаю, що це можливо через, HISTCONTROLале я не знайшов правильного шляху.


Я створив відповідне запитання: askubuntu.com/questions/205520/… . Дупи в історії корисно побачити контекст команди. Те, що ви хочете опустити дуп, іноді, коли ви друкуєте історію.
justingordon

Відповіді:


123

На bashчоловіковій сторінці:

ІСТКОНТРОЛ

Список значень, розділених двокрапкою, контролює спосіб збереження команд у списку історії. Якщо список значень включає в себе ignorespace, рядки, які починаються з пробілу, не зберігаються у списку історії. Значення ignoredupsпричин не призводить до збереження рядків, що відповідають попередньому запису історії. Значення ignorebothскорочення для ignorespace та ignoredups. Значенняerasedupsпризводить до того, що всі попередні рядки, що відповідають поточному рядку, будуть видалені зі списку історії, перш ніж цей рядок буде збережено. Будь-яке значення, яке не є у наведеному вище списку, ігнорується. Якщо HISTCONTROL не встановлено, або не містить дійсного значення, всі рядки, прочитані аналізатором оболонки, зберігаються у списку історії, залежно від значення HISTIGNORE. Другий та наступні рядки багаторядкової складеної команди не перевіряються і додаються в історію незалежно від значення HISTCONTROL.

Тому поставте наступний рядок у своєму ~/.bashrc:

export HISTCONTROL=ignoreboth:erasedups


Ви хочете, щоб я додавав HISTCONTROL = ignoreboth внизу ~ / .bashrc?
karthick87

1
@karthick Не має значення, де ти його поклав, однак дно добре.
Ісая

На моїй установці Ubuntu 12.04 я повинен був зробити цю модифікацію в ~/.bash_loginбільшості випадків це буде працювати , якщо .bashrc модифікується , але це не так все час.
ck-

3
Не забудьте запустити їх після оновлення файлів bash / rc -source ~/.bashrc && source ~/.bash_profile
Eric Kigathi

23

Вставте це у свій ~/.bashrc:

export HISTCONTROL=ignoredups

Ви можете замість цього використовувати ignoreboth. Це скорочення як для ignorespacesкоманд, починаючи з пробілів, так і для ignoredupsдублікатів.

Я віддаю перевагу ignoredupsсамостійно, оскільки мені здається, що поведінка за замовчуванням ігнорування команд з пробілами на фронті є дуже дратівливою, коли я копіюю команду з веб-сайту, і вона не зберігається, тому що я випадково скопіювала в простір теж .... Але для кожен свій.


3
Досі дублікати існують .. У чому може бути проблема ?? imgur.com/fXeLQ.png
karthick87

5
@ karthick87, цитується з іншої відповіді: Значення ignoredupsпричин рядків, що відповідають попередньому запису історії, не зберігається . Він видаляє лише послідовні однакові лінії.
AL

10

Підставляючи це в ~/.bashrcзастосує рішення @ Елвін на різних сесіях, wlell

HISTCONTROL=ignoredups:erasedups
shopt -s histappend
PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"

Джерело: Linux: Історія баш: налаштування "ignoredups" та "erasedups" конфліктують із загальною історією протягом сесій


Чому його використання export HISTCONTROLі ваше не роблять? Яка різниця? Це працює для мене без експорту, мені просто цікаво
колись

1
Гарне питання! Я також хотів би дізнатися відповідь. Взагалі exportробить змінну доступною для підпроцесів. stackoverflow.com/q/1158091/552621 У разі HISTCONTROL, PROMPT_COMMANDі т.д., ці змінні використовуються самої оболонки , так , можливо , їх експорт (для дітей процесів) не є необхідним.
Nour Wolf


3

Додайте до свого ~/.bashrc:

export HISTCONTROL=ignoredups

Для цього можна скористатися цією командою:

nano ~/.bashrc

0

Uniqely записувати кожну нову команду складно. Спочатку потрібно додати ~/.profileабо подібне:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Потім потрібно додати до ~/.bash_logout:

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