Как отключить сеансы Bash в OS X El Capitan

По-видимому, новая функция в OS X El Capitan (бета-версия 10.11) — это сеансы Bash (терминальные сеансы). Теперь у меня есть каталог ~/.bash_sessions с файлами истории, и мои envars HISTFILE и HISTIGNORE переопределяются. Как отключить весь этот функционал?


person Whymarrh    schedule 05.09.2015    source источник
comment
«…мои… энвары HISTIGNORE переопределяются». Ты уверен? /etc/bashrc_Apple_Terminal не изменяет HISTIGNORE (вообще не упоминается).   -  person Chris Page    schedule 15.01.2016
comment
если параметр оболочки histappend включен, история сеанса по умолчанию отключена   -  person yckart    schedule 23.11.2016


Ответы (4)


Это поведение определено в /etc/bashrc_Apple_Terminal. Он содержит комментарии к документации, описывающие, что он делает и как его настроить.

Вы можете отключить функцию истории команд для сеанса терминала, установив SHELL_SESSION_HISTORY=0 в своем сценарии ~/.bashrc, как описано здесь:

Вы можете отключить это поведение и совместно использовать единую историю, установив для SHELL_SESSION_HISTORY значение 0. Существуют некоторые распространенные пользовательские настройки, которые организуют совместное использование новых команд среди запущенных оболочек путем манипулирования историей при каждом запросе, и они обычно включают «shop -s histappend»; поэтому, если опция оболочки histappend включена, история сеанса по умолчанию отключена. Вы можете явно включить его, установив для SHELL_SESSION_HISTORY значение 1.

Обратите внимание, что хотя вы можете отключить весь механизм восстановления состояния сеанса, создав ~/.bash_sessions_disable, в этом нет необходимости только для отключения функции истории команд для каждого сеанса, и это не рекомендуется.

person Chris Page    schedule 15.01.2016
comment
Хорошая находка! Однако просмотр /etc/bashrc_Apple_Terminal приводит меня к мысли, что единственный способ полностью предотвратить эту функцию — установить "$HOME/.bash_sessions_disable" (то есть без этого файла он все равно будет создавать каталог сеансов). - person Whymarrh; 15.01.2016
comment
@Whymarrh Вы пропустили часть моего ответа? Я сказал, что этот файл отключает механизм состояния сеанса, но это излишество, если все, что вы хотите сделать, это отключить историю команд оболочки для каждого сеанса. - person Chris Page; 18.01.2016
comment
Следует отметить, что если кто-то использует другой терминал, такой как Alacritty или iTerm, и никогда не открывает приложение терминала Apple, ничего из этого дополнительного поведения не произойдет. Другими словами, тонны переменных среды ($TERM_SESSION_ID, $SHELL_SESSION_*) и каталог ~/.bash_sessions не будут созданы. Все эти дополнения создаются только при открытии приложения Apple Terminal. - person danemacmillan; 24.01.2019

Если вы запускаете новый сеанс Bash вручную (например, bash -xl), вы можете увидеть, что запускается при входе в систему.

В выводе вы увидите следующую строку:

....
+++ '[' '!' -e /Users/username/.bash_sessions_disable ']'

Вы можете создать файл .bash_sessions_disable в своем домашнем каталоге, чтобы отключить эту функцию.

person Whymarrh    schedule 05.09.2015
comment
Мне нравится иметь доступ к немного большему количеству истории, чем раньше, но накладывает ли это на себя какие-то ограничения? Похоже, у меня есть два или три файла для каждого вызова терминала с момента установки 10.11. Всего два мегабайта в месяц, но все же.... - person WGroleau; 29.11.2015
comment
@WGroleau: эта функция связана не с объемом истории, а с хранением отдельных историй команд для каждого сеанса терминала, так что, если вы восстанавливаете терминалы с помощью Resume, истории останутся отдельными — такими, какими они были при их первоначальном создании. Применяются обычные переменные оболочки HISTSIZE и HISTFILESIZE. На самом деле рекомендуется увеличить один или оба из них, потому что каждый сеанс также добавляет свою историю в глобальный файл ~/.bash_history, чтобы вся ваша история была доступна в новых терминалах. См. комментарии в /etc/bashrc_Apple_Terminal для более подробной информации. - person Chris Page; 15.01.2016
comment
@WGroleau: он также автоматически удаляет файлы сеансов старше двух недель один раз в день. - person Chris Page; 15.01.2016
comment
Заметьте, я сказал два мегабайта в МЕСЯЦ? Они не удаляются. Если бы была переменная для управления этим, я бы установил ее на 24 часа. Мне никогда не приходилось восстанавливать сеанс после выхода, и если я когда-нибудь это сделаю, то не после того, как я открыл и вышел из других сеансов. немного неточно, что вся ваша история доступна. Каждая сессия читает историю. Откройте другой, он читает ту же историю, без ничего из первого сеанса. Каждый при выходе записывает известную историю, перезаписывая файл. история последнего сеанса сохраняется в файле .bash_history. - person WGroleau; 17.01.2016
comment
@WGroleau «Они не удаляются». Файлы старше двух недель будут удаляться один раз в день — все варианты поведения доступны для просмотра в /etc/bashrc_Apple_Terminal. Если вы видите файлы старше двух недель, отправьте отчет об ошибке. Если вы хотите контролировать, как долго они остаются, также отправьте отчет. Но если вам вообще не нужны истории команд для каждого терминала, вы можете отключить их с помощью SHELL_SESSION_HISTORY=0, как я описал в моем ответ. - person Chris Page; 18.01.2016
comment
Да, я прочитал это после моего комментария. Рад это знать. Другая часть комментария не очень понятна, поэтому: если у вас одновременно открыто более одного сеанса, только тот, который был закрыт последним, сохраняет свою историю в ~/.bash_history. - person WGroleau; 18.01.2016
comment
Я обязательно отправлю этот отчет об ошибке. Я никогда не делал ничего, чтобы изменить поведение сеанса bash. Когда я это обнаружил, я очистил все до начала ноября. В настоящее время они восходят к 8 ноября 2015 года, и каждый сеанс имеет три файла: история 16 КБ, сессия ~ 50 байт и история ноль байтов (?!?). - person WGroleau; 21.01.2016
comment
Я не думаю, что это хорошо задокументировано в файле /etc/bashrc_Apple_Terminal. Я сохраняю историю через окна терминала. Я не хочу, чтобы на Mac это отличалось от Linux, и я использую один и тот же .bashrc и .bash_profile между Mac и Linux. Я не очень понимаю, что он делает. Какой сеанс он выбирает для восстановления? Что он восстанавливает по умолчанию? Восстанавливает ли он переменные env? Я запускаю новую оболочку по какой-то причине, со специально установленными переменными среды, и я не хочу сохранять временные изменения. /etc/bashrc_Apple_Terminal кажется мне запутанным и нежелательным. - person nroose; 15.03.2016

Подводя итог, это связано с функцией Apple Resume. Когда эта функция включена, когда вы выходите из приложения или перезагружаетесь, при следующем открытии приложения открываются ранее открытые окна.

Что касается Терминала, для этого должны быть выполнены три вещи:

  1. $HOME/.bash_sessions_disable должен не присутствовать
  2. System Preferences/General/Close Windows when quitting an app должен быть не отмечен.
  3. При перезагрузке выберите Reopen windows.

Когда вы снова откроете Терминал, он снова откроет те же окна и вкладки, которые были у вас раньше, в тех же положениях экрана. Кроме того, если вы отметили Terminal/Preferences/your-window-type/Windows/Resume/Restore-text-when-reopening-windows, он восстановит текст на каждом экране.

Наконец, и это относится конкретно к вопросу OP, он восстановит историю в каждом окне/вкладке, если выполняются следующие условия:

  1. SHELL_SESSION_HISTORY не установлен или установлен на 1
  2. shopt histappend не установлен
  3. HISTTIMEFORMAT не установлен

Если SHELL_SESSION_HISTORY явно задано значение 1 в .bashrc, последние два требования переопределяются, то есть могут быть установлены shopt histappend или HISTTIMEFORMAT.

Кроме того, необходимо обратить внимание на переменные HISTSIZE и HISTFILESIZE. Они не должны быть слишком большими или слишком маленькими, и некоторые советуют оставить их неустановленными, чтобы они принимали значения Apple по умолчанию.

person chetstone    schedule 15.09.2017
comment
echo $HISTSIZE и echo $HISTFILESIZE покажут ваши текущие настройки. Мои 500. Это значения по умолчанию? Как отключить их было бы полезной информацией. - person John; 19.09.2020

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

Единственная причина, по которой я приобрел эти знания, заключается в том, что я искал альтернативное решение необходимости создания ~/.bash_sessions_disable файла; Вместо этого я бы предпочел предотвратить поведение сеансов, просто добавив несколько строк в мой существующий файл ~/.bash_profile. К сожалению, это невозможно без использования ядерного оружия, поэтому официальный ответ по-прежнему остается лучшим подходом.

Сводка

Когда Bash впервые запускается в MacOS, он сначала будет источником /etc/profile, который, в свою очередь, будет источником /etc/bashrc. Содержимое этого файла включает эту строку:

[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"

Переменная среды $TERM_PROGRAM задается только приложением Apple Terminal. Печать значения этой переменной возвращает Apple_Terminal. Другими словами, файл /etc/bashrc пытается получить файл /etc/bashrc_Apple_Terminal, если он существует и доступен для чтения. Именно в этом файле MacOS выполняет свою специальную обработку сеанса Bash, чтобы связать функции возобновления работы ОС.

После всего этого Bash будет использовать любые конфигурации, которые пользователь имеет в своем домашнем каталоге (например, ~/.bash_profile или ~/.bashrc). При этом невозможно переопределить всю работу, проделанную в файле /etc/bashrc_Apple_Terminal, на чистом уровне конфигурации (по сравнению как с настройкой , так и с созданием нового файла), не делая того, о чем упоминали другие, а именно установки с $SHELL_SESSION_HISTORY по 0, чтобы исключить историю на основе сеансов, и создать ~/.bash_sessions_disable, чтобы предотвратить создание каталога .bash_sessions при каждом запуске терминала Apple.

Ядерный подход

Две возможные альтернативы устранения любой из этих новых функций MacOS: 1) удалить последнюю строку из файла /etc/bashrc или 2) переименовать или удалить /etc/bashrc_Apple_Terminal во что-то другое.

После этого приложение терминала Apple больше не будет вести себя иначе, чем эмуляторы терминалов других производителей.

person danemacmillan    schedule 24.01.2019