Как синхронизировать историю команд терминальной сессии в bash?

13

Я пытался найти ~/.bash_historyсвои последние команды во время сеанса терминала, но их просто не было. Я думаю, это потому, что у меня открыто несколько сеансов терминала.

Есть ли способ, которым я могу синхронизировать (т.е. синхронизировать-выдвинуть или записать-синхронизировать) текущую историю команд сеанса терминала в файл bash_history (не закрывая сеанс и не теряя эту среду)?

(По идее это было бы отдаленно похоже на то, как syncкоманда сохраняет модификации файловой системы в некоторых системах.)

Я полагаю, я мог бы настроить bash для сохранения истории нескольких сеансов, но возможность помещать текущий буфер истории по-прежнему будет полезна в сценариях, когда вы работаете на новой машине, и вы случайно забыли настроить bash так, как вам этого хотелось бы ,

n611x007
источник
Я пробовал history -a встроенную команду оболочки, но теперь я получаю «отказано в доступе» к .bash_historyфайлу.
n611x007
Дублированный вопрос. См .: unix.stackexchange.com/questions/1288/…
Эдуардо Легжеро

Ответы:

19

Добавьте эту строку к .bashrc:

export PROMPT_COMMAND="history -a; history -n"

Откройте новый терминал и проверьте.

объяснение

  • history -a добавляет новые строки истории в файл истории.
  • history -nговорит bashчитать строки, которые не читаются из файла истории в текущий список истории сеанса.
  • PROMPT_COMMAND: содержимое этой переменной запускается как обычная команда перед bashприглашением показа. Поэтому каждый раз, когда вы выполняете команду, history -a; history -nвыполняется и ваша bashистория синхронизируется.
cuonglm
источник
Благодарность! Я не знаю, почему раньше мне было отказано в разрешении, но теперь с новыми терминалами это работает, как и ожидалось! Я думаю, что я обычно должен быть в состоянии использовать history -aв терминале с неизмененным Bashrc тоже.
n611x007
когда нужно начинать беспокоиться о последствиях для производительности? (Я думаю о недорогих устройствах, не знаю, насколько большие издержки это делает.)
n611x007
1
Также у вас уже может быть команда подсказки, в этом случае ее лучше использоватьexport PROMPT_COMMAND="${PROMPT_COMMAND};history -a; history -n"
Fabian
Если ${PROMPT_COMMAND}пусто, это дает ошибку из-за опережающего;
Борис Деппен
@ BorisDäppen прав, но это легко исправитьexport PROMPT_COMMAND="${PROMPT_COMMAND}${PROMPT_COMMAND:+;}history -a; history -n"
TML