Почему история bash на моем mac не сохранится?

28

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

Как я могу узнать, что идет не так? Или переустановить все с пустого.

abaini01
источник
Может быть ваш профиль или файл RC. Что в них?
user14492
1
Каковы права доступа и владелец вашей истории .bash_history? Мои 600 и принадлежат мне. Кроме того, что в $ HIST_FILE?
Blm
@blm Разрешения верны; распечатав $ HIST_FILE, я узнал о .bash_sessions . По-видимому, существуют проблемы, когда в конце сеанса ОС сохраняет эти файлы в файл истории. Я не хочу больше заниматься расследованиями, поэтому я просто положил это у себя дома .bash_sessions_disableи знаю, что это вернулось к поведению по умолчанию
abaini01
Пожалуйста, рассмотрите возможность отправки отчета об ошибке в Apple: developer.apple.com/bug-reporting
Крис, страница

Ответы:

31

Я сделал это:

Добавить переменную в .bash_profileфайл

SHELL_SESSION_HISTORY=0

перезапустите терминал и после этого он будет работать так, как я хотел бы. (Он сохранил команды после того, как я закрыл терминал)

PS я также использую HISTFILESIZEи HISTSIZEпеременные

HISTSIZE - это количество строк или команд, которые хранятся в памяти в списке истории, пока ваша сессия bash продолжается.

HISTFILESIZE - это количество строк или команд, которые (a) разрешены в файле истории во время запуска сеанса, и (b) сохранены в файле истории в конце сеанса bash для использования в будущих сеансах.

Sysqa
источник
3
Добавление этой строки отлично работает для меня на El Capitan, спасибо.
Эйдан
2
Благодарность! Я хотел бы знать, почему это тоже работает, если кто-то знает. (История = 0 будет означать для моего невежественного ума, что вся история будет потеряна, но, похоже, она имеет противоположный эффект.)
Майк Уильямсон,
@Sysqa Есть ли какое-то "посередине" решение? Функция, которая «сохраняет и восстанавливает историю команд bash независимо для каждого восстановленного сеанса терминала», звучит как приятная функция, от которой может выиграть некоторая программа. Есть ли какой-то способ получить преимущества от предыдущей конфигурации, а также от новой конфигурации с какой-либо конфигурацией?
loco.loop
8

Начиная с 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?»? Если последнее, я отсылаю вас к коду, который подробно документирован. Или вы должны начать еще один вопрос и ответ на этот вопрос.
Крис Пейдж
Я имею в виду, что PROMPT_COMMAND для ... @ChrisPage
loco.loop
@ loco.loop Я отсылаю вас к документации Bash или предлагаю вам начать Q & A по этому поводу.
Крис Пейдж
6

Только в случае , если есть другие, что там есть РВМ (Ruby Version Manager) установлена: Проверьте , чтобы увидеть , если у вас есть следующие строки в ваших ~/.profile, ~/.bashrcили ~/.bash_profileфайлах.

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

Это, вероятно, RVM, предотвращающий выходную "зацепку" для запуска bash_sessions

Это было проблемой для меня. Попробуйте это закомментировать.

Источник: Reddit

Nate
источник
3

При новой установке Mac OS X (обновлена ​​до 10.13.6) история команд bash не сохранялась. Также не было файлов .bashrc или .bash_profile. В этом случае просто добавление пустого файла .bashrc исправило это для меня.

touch .bashrc

Кажется, это все, что тебе нужно ...

Vesal
источник
Похоже, что проблема с Mojave / 10.14 тоже
исправлена
3

У меня была такая же проблема с недавно установленным OSX Mojave. Я проверил свой ~/.bash_historyфайл и увидел это:

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

Простое покушение на Гилма решило проблему. Я использовал:

sudo chown gilm /Users/gilm/.bash_history

и это решило мою проблему.

gilm
источник
2

Вы также можете создать .bash_logoutфайл со следующим:

shell_session_update

Получено из комментария GitHub

охотник
источник
Или введите trap shell_session_update EXITодин раз вручную и выйдите из системы. В /etc/bashrc_Apple_Terminalсценарии есть подсказки , которые слишком скучны, чтобы включать их здесь.
MarkHu