Збереження історії bash з декількох консолей працює неправильно


9

Я використовую кілька терміналів 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, вона ніколи не збільшує команду "ні" у відповідь. Проте старі команди все ще зникають. А кількість команд в історії завжди залишається трохи більше 500.

.bash_historyФайл по- , як і раніше містить багато дублів, незважаючи на ignoredups.

PS: Вихід ехо $HISTSIZEі $HISTFILESIZEобидва=1000


Оновлення: Проблему я знайшов у вищенаведеному записі .bashrc. Просто зателефонувавши history -aв PROMPT_COMMANDпросто дописує останню нову команду до .bash_history. Тож ignoredupsі erasedupsне мають ніякого ефекту.

Чи є якийсь спосіб, я все ще можу писати в .bash_history без дублікатів з кожного терміналу? Я не хочу завантажувати всю історію в кожному командному рядку history -rі записувати її знову назад history -w, тому що команди, які я видав в одному терміналі, також з'являться в іншому паралельному запущеному терміналі. Я хочу, щоб комбіновані команди відображалися лише в новому терміналі.

Загадка, чому мою історію доводили до 500, вирішена. Я помітив, що це траплялося кожного разу, коли я впадаю в цю машину. Створення a .bash_profileіз наступним записом вирішило цю проблему.

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

Тепер мій .bashrc виконується кожного разу, коли я також ssh. А розмір файлу історії тепер монотонно збільшується.


Це те, що ти шукаєш? unix.stackexchange.com/questions/1288/…
jasonwryan

Ні. Я хочу уникати другої вимоги у списку Олі. Я не хочу, щоб історія мого іншого терміналу переплутувалася. Поки я не запускаю новий термінал. Це те, що природно відбувається, коли я належним чином вимкнув машину. Але іноді належне відключення неможливо, і якщо я не збережу історію миттєво, все буде втрачено в раптовому відключенні живлення.
indiajoe

Дуже схоже на питання, що з’являється у bug-bashсписку розсилки через рік після опублікування цього питання: list.gnu.org/archive/html/bug-bash/2013-07/msg00092.html
syntaxerror

Відповіді:


1

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

tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp 
mv $HOME/.hist_Temp $HOME/.bash_history

Вищевказана команда збереже останнє виникнення команди та видалить усі інші повторення над нею з файлу історії, не порушуючи порядок.


0

Це негарно, і я впевнений , що sedі awkбуло б краще, але я спробував виправити ту ж проблему, додавши це в моєму .bashrc:

export HISTFILE=.bash_history_`tty | python -c 'import sys ; sys.stdout.write(sys.stdin.read().strip().replace("/", "_"))'`

Це створить окремий файл історії для кожного відкритого терміналу, але якщо ви запускаєте bash в межах bash, він буде використовувати ту саму історію, але не повинен перезаписувати. Я попереджу вас застереженням зі свого досвіду. Хоча це працює і не дозволяє переписувати історію, вам доведеться grepкілька файлів, щоб спробувати знайти потрібну історію, що часом може зайняти багато часу.

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