Я использую несколько терминалов Konsole. И я хочу, чтобы все команды, которые я набираю на каждом терминале, были сохранены в истории команд, чтобы в следующей открытой консоли все они были. Чтобы запретить каждому терминалу перезаписывать историю команд другого терминала, я дал следующие настройки в моем.bashrc
# avoid duplicates and commands starting with space
export HISTCONTROL=ignoredups:erasedups:ignorespace
# append history entries..
shopt -s histappend
#My machine reboots without warning sometimes.Hence to save commands instantaneously.
export PROMPT_COMMAND="history -a"
export HISTSIZE=1000
PS1="\[\e[1;34m\]\! \[\e[0m\]"$PS1
Я дал последнюю строку, чтобы увидеть номер команды в моем приглашении. Команда № никогда не превышал 600, но некоторые из моих старых команд исчезают из истории. Есть много команд, которые даются повторно, но, как и следовало ожидать ignoredups
, никогда не увеличивает команду no in prompt. Все же старые команды все еще исчезают. И количество команд в истории всегда остается чуть больше 500.
.bash_history
Файл по- прежнему содержит много дублей, несмотря на ignoredups.
PS: вывод эха $HISTSIZE
и $HISTFILESIZE
оба=1000
Обновление: я обнаружил проблему в записи выше .bashrc
. Просто позвонив history -a
в PROMPT_COMMAND
просто дописывает последнюю новую команду к .bash_history. Так что ignoredups
и не erasedups
имеют никакого эффекта.
Есть ли способ, я все еще могу писать в .bash_history без дубликатов из каждого терминала? Я не хочу загружать всю историю в каждой командной строке history -r
и снова записывать ее обратно history -w
, потому что команды, которые я дал в одном терминале, появятся и в другом параллельно работающем терминале. Я хочу, чтобы объединенные команды появлялись только в новом терминале.
Загадка, почему моя история была урезана до 500, решена. Я заметил, что это происходит каждый раз, когда я захожу в эту машину. Создание .bash_profile
со следующей записью решило эту проблему.
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
Теперь мой .bashrc выполняется каждый раз, когда я тоже ssh. И размер файла истории теперь монотонно увеличивается.
источник
bug-bash
списке рассылки через год после его публикацииОтветы:
Я пришел к выводу, что невозможно добавлять новые команды напрямую и одновременно удалять любые дубликаты. Поэтому мое решение состоит в том, чтобы запустить следующие команды через некоторое время. или положить его в мой crontab.
Приведенная выше команда сохранит последнее вхождение команды и удалит все остальные повторения над ней из файла истории, не испортив порядок.
источник
Это уродливо, и я уверен, что
sed
илиawk
будет лучше, но я попытался решить ту же проблему, добавив это в мой.bashrc
:Это создаст отдельный файл истории для каждого терминала, который вы открываете, однако если вы запустите bash в bash, он будет использовать ту же историю, но не должен перезаписывать. Я предупрежу вас с оговоркой из моего опыта. Хотя это работает и предотвращает перезапись истории, вам нужно иметь
grep
несколько файлов, чтобы попытаться найти нужную историю, которая иногда может занимать много времени.источник