Чому історія bash на моєму Mac не збереже?


22

Я завжди використовував bash для роботи, і ніколи не було проблем з ним. Тепер вона не зберігає жодної команди в історії знову. Якщо я відкрию вікно терміналу, спробуйте деякі команди, він діє так, як все працювало добре і показувати історію за допомогою клавіш зі стрілками. Але якщо я закрию вікно (і це час, який він повинен був зберігати у файлі .bash_history) і відкриваю інший, немає жодних ознак останніх команд.

Як я можу дізнатися, що відбувається неправильно? Або знову встановіть все з порожнього.


Це може бути ваш профіль або файл rc. Що в них?
user14492

1
Які дозволи та власник у вашій .bash_history? Шахта у мене 600 і належить мені. Крім того, що відбувається в $ HIST_FILE?
blm

Дозволи @blm мають рацію; друк $ HIST_FILE, про який я дізнався .bash_sessions . Очевидно, існують проблеми, коли, наприкінці сеансу, ОС збереже цей файл до файлу історії. Я не хочу більше розслідувати, тому я просто поклав це в свій будинок .bash_sessions_disable і знати, що він повертається до поведінки за замовчуванням
abaini01

Будь ласка, розгляньте подання звіту про помилку з Apple: developer.apple.com/bug-reporting
Chris Page

Відповіді:


22

Я зробив це:

Додати змінну в .bash_profile файл

SHELL_SESSION_HISTORY=0

перезапустіть термінал і після цього він працюватиме так, як хотів би. (Команди збережені після закриття терміналу)

P.S. Я також використовую HISTFILESIZE і HISTSIZE змінні

HISTSIZE - це кількість рядків або команд, які зберігаються в пам'яті в списку історії, поки сеанс bash триває.

HISTFILESIZE - це кількість рядків або команд, які (а) дозволені в файлі історії під час запуску сеансу, і (b) зберігаються в файлі історії наприкінці сеансу bash для використання в майбутніх сесіях.


2
Додавши, що одна лінія працює добре для мене на El Capitan, спасибі.
Aidan

2
Дякую! Я хотів би знати, чому це теж працює, якщо хтось знає. (Історія = 0 означала б моєму неосвіченому розуму, що вся історія буде втрачена, але вона, здається, має протилежний ефект.)
Mike Williamson

@Sysqa Чи є "середнє" рішення? Функція, яка "зберігає та відновлює історію команд bash незалежно для кожної відновленої термінальної сесії", звучить як корисна функція, з якою може скористатися програма. Чи є якийсь спосіб мати переваги від попередньої конфігурації, а також нової з деякою конфігурацією?
loco.loop

6

Починаючи з OS X 10.11 El Capitan , встановлений системним скриптом /etc/bashrc_Apple_Terminal координати з терміналом для збереження / відновлення окремих історій команд для кожного відновленого терміналу Резюме .

Прочитайте коментарі в /etc/bashrc_Apple_Terminal для пояснення того, як він керує історіями команд на кожному терміналі і як його налаштувати.

Якщо ви налаштуєте PROMPT_COMMAND не забудьте об'єднатися з попереднім значенням, щоб не знищити системну команду:

PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND; }your_code_here"

Якщо ви встановите EXIT обробник сигналу з trap обов'язково зробіть щось подібне (або викликайте shell_session_update з вашого обробника, якщо ви не можете зрозуміти, як об'єднатися з попереднім значенням - це трохи задіяно).

Коли ви виходите з оболонки, цей код збереже нові команди до історії терміналу ~/.bash_sessions. Щоб побачити, чи виникли проблеми, замість закриття терміналу виходити з оболонки вручну exit (або Control-D). Він реєструє повідомлення про прогрес. Зверніть увагу, якщо вона не завершується або якщо відображаються будь-які попередження або повідомлення про помилки.

Загалом, bashrc_Apple_Terminal намагається виявити та вимкнути історію сеансів, якщо вона виглядає як користувач виконав будь-які налаштування, які не сумісні з ним. Це звучить, як ви, можливо, знайшли той, який він не обробляє. Будь ласка, розгляньте подання звіту про помилку з Apple: https://developer.apple.com/bug-reporting/


Я не зробив будь-якої спеціальної конфігурації, тому я думаю, що це не проблема. Не могли б ви пояснити, що робить PROMPT_COMMAND.
loco.loop

@ loco.loop Ви маєте на увазі "Що таке змінна PROMPT_COMMAND для Bash?" /etc/bashrc_Apple_Terminal використовувати PROMPT_COMMAND для? ”? Якщо останнє, я посилаю вас на код, який детально задокументований. Або про це слід почати інший запит і відповідь.
Chris Page

Я маю на увазі те, що PROMPT_COMMAND для ... @ChrisPage
loco.loop

@ loco.loop Я посилаю вас до документації Bash або пропоную вам розпочати запитання та відповіді про це.
Chris Page

5

Про всяк випадок, якщо є інші, які мають встановлений RVM (менеджер версій Ruby): Перевірте, чи є у вас наступний рядок у вашому ~/.profile, ~/.bashrc або ~/.bash_profile файлів.

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

Це, ймовірно, RVM, що перешкоджає запуску "hook" для bash_sessions.

Це була проблема для мене. Спробуйте прокоментувати це.

Джерело: Reddit


2

Ви також можете створити a .bash_logout файл з наступним:

shell_session_update

Отримано з коментаря GitHub


Або вручну введіть trap shell_session_update EXIT один раз і вийти. Є підказки в /etc/bashrc_Apple_Terminal сценарій, який занадто нудний, щоб включити тут.
MarkHu

1

На новій установці Mac OS X (оновлено до 10.13.6) історія команди bash не зберігається. Також не було файлів .bashrc або .bash_profile. У цьому випадку, просто додавши порожній файл .bashrc, це було виправлено для мене.

touch .bashrc

Це, здається, все, що вам потрібно ...


1

У мене була така ж проблема з нещодавно встановленим osx Mojave. Я перевірив свою ~/.bash_history файл і побачив це:

$ ls -l ~/.bash_history -rw------- 1 root staff 599 Jan 4 20:50 /Users/gilm/.bash_history

Проблему можна вирішити, просто набравши його назад до gilm. Я використав:

sudo chown gilm /Users/gilm/.bash_history

і це вирішило мою проблему.

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