Історія башів не зберігається між термінальними сеансами на Mac


33

Моя історія башів загадково перестала працювати, і я не маю уявлення, як це виправити. Ось так виглядає мій .bashrc:

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

Однак, коли я запускаю, echo $HISTFILEце роздруковується /Users/myusername/.bash_sessions/EE8689E5-7DAD-4018-817E-0AF1DE36082A.historynew.

Я є власником файлу .bash_history, тому я не надто впевнений, як би я пішов на вирішення цієї проблеми.

Спасибі!


Привіт, Нельсоне, ласкаво просимо до Супер Користувача. Швидка перевірка вставлених вами пробілів?
bertieb

так, вони були, я їх видалю і звітую.

@bertieb, я видалив пробіли, і тепер $ HISTFILESIZE належним чином відлунюється. Однак історія залишається незбереженою, і $ HISTFILE виводить цей непарний тимчасовий файл історії (який я припускаю, що зберігає історію саме цього сеансу).

Ви намагаєтесь змінитись $HISTFILEіз інтересу? У мене немає .bashrcOSX і echo $HISTFILEповідомляє про місце, яке я б очікував - чи коментування згаданих рядків має якийсь ефект?
bertieb

1
Завжди вказуйте змінну шлях розкладання: HISTFILE="$HOME/.bash_history”. Без лапок ваша версія буде недійсною, якщо шлях до вашого домашнього каталогу містить пробіли (або, можливо, інші спеціальні символи).
Кріс Пейдж

Відповіді:


26

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

Нова папка (~ / .bash_sesions /) використовується для зберігання файлів 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


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

@rabs Я б запропонував додати SHELL_SESSION_HISTORY=0вгорі ~/.bash_profile.
Teejay

5

Ви можете вирішити проблему RVM, оновивши до останньої версії RVM або виконавши це:

  echo 'shell_session_update' > $HOME/.bash_logout

Дивіться https://github.com/rvm/rvm/isissue/3540 для отримання додаткової інформації.


1
Приємне виправлення, не змінюючи rvm.
mlo55

1
Ми говоримо про менеджера з обстановки Ruby EnVironment (RVM) rvm.io ?? Коли і навіщо до цього слід брати участь?
MarkHu

3

Ця відповідь з теми Reddit врятувала мене:

Ймовірно, RVM заважає виходу "гачок" для запуску bash_sesions. Якщо ви прокоментуєте наступний рядок у своєму .bash_profile, він повинен працювати.

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

Це справді допомогло!
Карстен

1

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


Я відредагував .profile, щоб він був таким самим, як мій .bashrc, і історія все ще не з’являється.

@NelsonLiu Що відбувається, коли ви лунаєте $HISTFILEв різних частинах profile? Можливо, ви джерело іншого сценарію, який змінює змінну? Я перевірив Terminalі те iTerm, bash 3і в 4 обох є їх за замовчуванням $HOME/.bash_history.
Theoden

як би я відлучив $ HISTFILE в різних частинах профілю?

@NelsonLiu, це не очевидно? Ваша мета - відстежити, коли $HISTFILEзміниться. Таким чином, просто зробіть два echo $HISTFILEоточуючих ваш код. Що вам потрібно зробити, це знайти фрагмент коду, який $HISTFILEзмінюється, переміщуючи обидві echo $HISTFILEлінії все ближче та ближче один до одного, по черзі, поки щось не виявиться. Це все.
theoden

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