Подтвердить что ты не робот

История -a против истории -w в BASH

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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


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

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

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

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

Ответ 2

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

export HISTCONTROL=ignoredups

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

http://stefaanlippens.net/bashduplicates

Ответ 3

Используйте BASH variable 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.

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