история -a против истории -w в BASH - PullRequest
14 голосов
/ 08 сентября 2011

Я пишу свой PROMPT_COMMAND="history -a;$PROMPT_COMMAND", но я все еще получаю дубликаты из разных сеансов терминала. Кажется, я все еще получу несколько дубликатов, но получаю меньше, используя команду PROMPT_COMMAND="history -w;$PROMPT_COMMAND".

Я знаю, что могу сделать history -a;history -c; history -r, но я не хочу, чтобы они все синхронизировались. Я хочу, чтобы это произошло, когда я называю историю -n. Я в основном использую историю -a или историю -w, но я не могу найти разницу между ними. Какой из них лучше избегать как можно большего количества дубликатов.

Ответы [ 3 ]

20 голосов
/ 08 сентября 2011

Вы задали два вопроса:

В чем разница между history -a и history -w?

history -a добавит добавление вашей текущей истории сеанса к содержимому файла истории.

history -w заменит содержимое файла истории на текущую историю сеанса.

Какой из них позволяет избежать дублирования?

Теоретически нет. Ни -a, ни -w не проверяет наличие дубликатов. Практически -w позволяет избежать большего количества дубликатов, поскольку он заменяет содержимое файла истории. Любые потенциальные повторяющиеся записи в файле удаляются вместе со всем остальным в файле.

Подробнее о команде history в руководстве по bash.


Еще немного информации о других возможностях уничтожения дубликатов:

Специальная переменная bash HISTCONTROL=ignoredups здесь мало помогает, потому что она устраняет только дубликаты, когда они вводятся в работающую оболочку. Это не делает ничего, чтобы предотвратить существующие дубликаты в текущей истории или в файле истории. Более того, ignoredups игнорирует только команды, которые являются дубликатами предыдущей команды, если только она не является дубликатом какой-либо команды в истории.

К сожалению, даже очень многообещающий HISTCONTROL=erasedups не очень помогает здесь. erasedups стирает любую запись истории, соответствующую введенной в данный момент команде. К сожалению, это происходит только в текущей истории сеанса. Он не ищет дубликаты в файле истории. Это также не помешает дубликатам войти в историю сеансов при использовании history -n.

Подробнее о специальной переменной HISTCONTROL см. В руководстве по bash.

0 голосов
/ 10 января 2016

Используйте переменную BASH PROMPT_COMMAND с history и с помощью команд sort и uniq:

$> export PROMPT_COMMAND="history -a && history -c && sort ~/.bash_history | uniq > ~/.bash_history_new && rm ~/.bash_history && mv ~/.bash_history_new ~/.bash_history && history -r"

При этом вам не нужно устанавливать shopt -s histappend и делать export HISTCONTROL=erasedups.

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

0 голосов
/ 08 сентября 2011

вы можете избежать дубликатов, используя это

export HISTCONTROL=ignoredups

Вы можете посмотреть на это для получения дополнительной информации:

http://stefaanlippens.net/bashduplicates

...