История Bash не сохраняется между терминальными сессиями на Mac

33

Моя история bash загадочным образом перестала работать, и я понятия не имею, как это исправить. Вот как выглядит мой .bashrc:

HISTSIZE=500
HISTFILESIZE=500
HISTFILE=$HOME/.bash_history

Тем не менее, когда я бегу, echo $HISTFILEон печатает /Users/myusername/.bash_sessions/EE8689E5-7DAD-4018-817E-0AF1DE36082A.historynew.

Я владелец файла .bash_history, поэтому я не очень уверен, как бы я решил эту проблему.

Благодарность!


источник
Привет Нельсон, добро пожаловать в Super User. Быстрая проверка тех мест, которые вы вставили?
бертиб
да, я удалю их и сообщу.
@bertieb, я удалил пробелы и теперь $ HISTFILESIZE правильно отображается. Однако история остается несохраненной, и $ HISTFILE распечатывает этот странный временный файл истории (который, как я предполагаю, хранит историю только для этого сеанса).
Вы пытаетесь измениться $HISTFILE, из интереса? У меня нет .bashrcOSX, и echo $HISTFILEя сообщаю о месте, которое я ожидал - комментирование обсуждаемых строк имеет какой-либо эффект?
бертиб
1
Всегда указывайте переменную путь разложения: HISTFILE="$HOME/.bash_history”. Без кавычек ваша версия будет недействительной, если путь к вашей домашней директории содержит пробелы (или, возможно, другие специальные символы).
Крис Пейдж

Ответы:

26

Терминал назначает каждому сеансу терминала уникальный идентификатор и передает его через переменную среды TERM_SESSION_ID, чтобы программы, работающие в терминале, могли сохранять / восстанавливать специфическое для приложения состояние при выходе и перезапуске Терминала с включенным Возобновлением.

Новая папка (~ / .bash_sessions /) используется для хранения файлов HISTFILE и .session, которые являются уникальными для сессий.

Во время запуска оболочки файл сеанса выполняется. Старые файлы периодически удаляются.

Поведение по умолчанию позволяет сохранять и восстанавливать историю команд bash независимо для каждого восстановленного сеанса терминала. Он также объединяет команды в глобальную историю для новых сессий.

Вы можете отключить это поведение и поделиться одной историей, установив

export SHELL_SESSION_HISTORY=0

Если определен HISTTIMEFORMAT, история отдельных сеансов по умолчанию отключена (подробнее читайте в / private / etc / bashrc_Apple_Terminal)

Механизм сохранения / восстановления отключен, если существует следующий файл:

~/.bash_sessions_disable

Apple уже изменила свое поведение после релиза El Capitan, так что лучше узнать об этом здесь less /private/etc/bashrc_Apple_Terminal

diimdeep
источник
3
Но не просто начните с отключения механизма сохранения / восстановления. Если у вас возникли проблемы с историей команд оболочки, попробуйте решить эту проблему. ~/.bash_sessions_disableФайл предназначен в качестве последнего средства в случае , если есть проблема , которая не может быть решена конкретно. Он отключает не только историю команд для каждой сессии, и вы можете отключить только историю команд для каждой сессии. Смотрите комментарии в /etc/bashrc_Apple_Terminalдеталях.
Крис Пейдж
1
@ChrisPage На самом деле Apple изменила некоторые части скрипта. Обновленный ответ, спасибо.
diimdeep
@diimdeep Где бы я добавить эту строку? export SHELL_SESSION_HISTORY=0
нулевая отметка
@zerohedge .bashrcи .bash_profile unix.stackexchange.com/a/310150/15362
diimdeep
@diimdeep Спасибо. Кажется, это работает прямо сейчас. Есть ли у него какие-либо последствия?
нулевая отметка
6

Я заметил нечто подобное после обновления El Capitan. Простое добавление .bash_sessions_disableфайла в ваш домашний каталог отключает новые сеансы bash и .bash_historyснова используется.

Эта ветка Reddit имеет больше информации и дальнейших ссылок.

БОА
источник
Но не просто начните с отключения механизма сохранения / восстановления. Если у вас возникли проблемы с историей команд оболочки, попробуйте решить эту проблему. ~/.bash_sessions_disableФайл предназначен в качестве последнего средства в случае , если есть проблема , которая не может быть решена конкретно. Он отключает не только историю команд для каждой сессии, и вы можете отключить только историю команд для каждой сессии. Смотрите комментарии в /etc/bashrc_Apple_Terminalдеталях.
Крис Пейдж
Спасибо Крис - что еще отключает, моя история работала как ожидалось (так же, как предыдущая версия osx и так же, как linux) за последние пару месяцев. Не знаете, почему они изменили это?
Раб
@rabs Я бы посоветовал добавить SHELL_SESSION_HISTORY=0в начало ~/.bash_profile.
Teejay
5

Вы можете решить проблему RVM, обновившись до последней версии RVM или выполнив это:

  echo 'shell_session_update' > $HOME/.bash_logout

См. Https://github.com/rvm/rvm/issues/3540 для получения дополнительной информации.

Алекс Рожо
источник
1
Хорошее исправление, без изменения rvm.
mlo55
1
Мы говорим о Ruby enVironment Manager (RVM) rvm.io ?? Когда и почему это должно быть вовлечено?
MarkHu
3

Этот ответ из ветки Reddit спас меня:

Это, вероятно, RVM, предотвращающий выходную "зацепку" для запуска bash_sessions. Если вы закомментируете следующую строку в вашем .bash_profile, она должна работать.

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
noio
источник
Это действительно помогло!
Карстен
1

Если это Mac, я предполагаю, что это оболочка входа по умолчанию, bashи она работает .profileвместо .bashrc. Итак, вы редактировали не тот файл.

Теоден
источник
Я отредактировал .profile, так что он такой же, как мой .bashrc, а история до сих пор не подходит.
@NelsonLiu Что происходит, когда вы эхо $HISTFILEв разных частях profile? Может быть, вы используете другой скрипт, который меняет переменную? Я проверил оба Terminalи iTerm, bash 3и 4 оба имеют свои значения по умолчанию $HOME/.bash_history.
Теоден
Как бы я повторил $ ​​HISTFILE в разных частях профиля?
@ НельсонЛю, разве это не очевидно? Ваша цель - отслеживать, когда все $HISTFILEменяется. Таким образом, просто сделайте два echo $HISTFILEокружения вашего кода. Что вам нужно сделать, так это найти фрагмент кода, в котором происходят $HISTFILEизменения, перемещая обе echo $HISTFILEстроки ближе и ближе друг к другу, построчно, пока что-то не откроется. Вот и все.
Теоден
1
поэтому я сделал так, как вы указали, и сделал .bash_profile таким же, как профиль. Я решил в echo $HISTFILEкаждой строке, просто чтобы увидеть, есть ли различия. Тем не менее, это просто напечатано /Users/username/.bash_historyнесметное количество раз. Затем я побежал echo $HISTFILEв оболочку, и он вывел /Users/nelsonliu/.bash_sessions/CD275A29-1DF1-4ED8-B8CE-F706B11B812F.historynew.
0

Я видел эту проблему на Высокой Сьерре. Каким-то образом мой собственный .bash_history стал владельцем root и даже не имел разрешений на чтение для других пользователей (когда содержимое домашнего каталога просматривалось с помощью ls -al)

В этом файле .bash_history не было никаких последствий, поэтому я сделал sudo rm .bash_history, а затем коснулся .bash_history, чтобы создать новый.

Сейчас все вроде хорошо

Джулиан Джордан
источник
Для меня это были не права доступа к файлу, а то, что я не определил ни одну из управляющих переменных HIST. По-видимому, один или несколько из них должны быть определены. Я добавил это в мой ~/.bash_profileфайл:export HISTTIMEFORMAT='%F %T '
MarkHu