Перезапустить bash с терминала, не перезапуская терминальное приложение (mac)?

46

Я оглянулся и нашел ответ на этот вопрос, но, похоже, я его не нашел (что странно).

Мой вопрос, есть ли простой способ перезапустить сеанс Bash из терминала на Mac. Мне просто нужно такое же поведение, как если бы я закрыл приложение терминала и снова запустил его (сброс всех переменных, получение источника .bash_profile и т. Д.).

Я знаю, как получить исходный код .bash_profile, но это не то, что я хочу. Одна из причин, по которой я хочу это сделать, заключается в том, что плагин для моей подсказки bash содержит код, который предотвращает многократную загрузку цветов. Поэтому sourcing .bash_profile не перезагружает переменные цвета, и мне нужно перезапустить терминальное приложение, чтобы изменения вступили в силу.

Маттиас
источник

Ответы:

65

exec bash должен заменить текущий процесс оболочки на (новый экземпляр) bash.

Muzer
источник
2
Является ли bash в терминальном приложении интерактивной оболочкой и exec bashперезапускает эту интерактивную оболочку только тогда? Кроме того, можете ли вы объяснить, что именно выполняет команда exec и ее параметры? Благодарность!
Маттиас
exec заменяет текущий процесс новым. Bash имеет очень хорошо написанную, но, к сожалению, сложную для поиска справочную страницу; введите man bash, найдите последний экземпляр строки SHELL BUILTIN COMMANDS, а затем прокрутите вниз до exec. Короче говоря, передача -cфлага запускает его без каких-либо переменных среды (которые могут потребоваться для ваших целей, я не знаю), а другие аргументы -l и -a, вероятно, не те вещи, которые вы хотите (они кажутся историческими / непонятные и специфические особенности). Вы также можете использовать exec для открытия новых файловых дескрипторов в текущей оболочке, если вы не указали команду.
Музер
Можете ли вы показать пример использования exec для открытия новых файловых дескрипторов в текущей оболочке? А как насчет моего вопроса об интерактивной оболочке / логине? Является ли оболочка, запущенная в терминале, интерактивной оболочкой и касается ли она всей команды exec? И наконец, в ответе на этот вопрос рекомендуется использовать команду exec с флагом -l, но я не понимаю, что она делает. Извините за столь большой вопрос, я просто хочу понять, какие команды я использую.
Маттиас
1
Извини да Я не уверен насчет Mac, но по крайней мере в мире Linux оболочки, запускаемые с графического терминала, (обычно) не являются оболочками входа в систему, и вы перезапускаете только интерактивную оболочку, а не сам терминал или оболочку входа в систему. -lздесь аргумент bash и просто заставляет его вести себя как оболочка входа в систему. Открытие файловых дескрипторов в текущей оболочке не имеет ничего общего с вашим вопросом, но вы можете использовать, exec 4<>test.txtнапример, чтобы дескриптор файла 4 указывал на test.txt. Затем в остальной части вашей оболочки вы можете сделать echo test>&4вывод в test.txt.
Музер
1
@Muzer по причинам, с которыми я не могу сказать, что полностью согласен, OSX решила, что эмуляторы терминала GUI будут запускать оболочки входа в систему .
Тердон
1

Принятый ответ отлично подходит для оболочки, использующей bash, что также и было задано OP, однако я использую Terminal на macOS с оболочкой не по умолчанию (zsh), и выполнение команды, exec bashочевидно, не дает желаемого эффекта : он запускает bash вместо моей оболочки по умолчанию.

Таким образом, команда environment-agnostic будет exec $SHELLиспользовать переменную окружения, $SHELLкоторая хранит оболочку по умолчанию для пользователя.

Кроме того, обратите внимание, что Apple заменит bash на zsh в macOS Catalina, чтобы получить эффект, который ищет OP либо, exec zshлибо exec $SHELLэто будет путь после обновления до macOS 10.15.

ПВИП
источник