Изуродованная история

15

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

сойка
источник

Ответы:

11

Это полностью зависит от того, как оболочка решит справиться с этим

bashпо умолчанию файл истории будет перезаписан локальной историей каждой оболочки при выходе, поэтому последняя оболочка, которая выйдет, выиграет. histappendОпция заставит его приложить к основной истории вместо ( shopt -s histappend).

zsh делает то же самое по умолчанию, и имеет несколько вариантов работы с ним:

  • appendhistory - История каждой оболочки добавляется в основной файл истории при выходе из оболочки.
  • incappendhistory - Главный файл истории обновляется каждый раз, когда строка выполняется в любой оболочке, вместо ожидания, пока эта оболочка не выйдет
  • sharehistory- Нравится incappendhistory, но также извлекает изменения из файла основной истории во все запущенные оболочки, поэтому вы можете запустить команду в одной оболочке, а затем нажать Upв другой оболочке и увидеть ее.
Михаил Мрозек
источник
Теперь скажите мне, как это сделать в Bash, пожалуйста;)
tante
1
@tante shopt -s histappendне работает?
Михаил Мрозек
0

Первоначально я получил эту идею из книги О'Рейли "Инструменты для Unix".

По моему .profileя установил:

export HISTFILE=$HOME/.sh_hist.$$

Каждый раз, когда мои .profileчитают, я получаю новый файл истории с именем PID моего сеанса. Если у меня несколько логинов, каждый логин получает уникальный файл истории. Работает в kshа bash.

Если вы просто открываете новые терминалы в сеансе X, они обычно не являются оболочками входа в систему, но вы можете настроить их для работы в качестве оболочек входа. Например, rxvt +lsзапустится rxvtкак оболочка для входа. Проверьте документы для любого терминала, который вы используете.

Кроме того, если вы не используете файл .logoutили .bash_logout(или некоторые другие средства) для очистки, у вас в конечном итоге будет куча .sh_histфайлов.

mazianni
источник
0

tcsh: set savehist = (5000 merge)сливается

user39122
источник