история-A vs история-w в Баш

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

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

3 ответов


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

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

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

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

какой из них избегает больше дубликатов?

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

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


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

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

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

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


вы можете избежать дублирования с помощью этого

export HISTCONTROL=ignoredups

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

http://stefaanlippens.net/bashduplicates


используйте переменную 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.

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