Перезапустити bash з терміналу без перезавантаження програми терміналу (mac)?


46

Я озирнувся і покусав відповідь на це питання, але, здається, не знаходжу його (що дивно).

Моє запитання: чи є простий спосіб перезапустити сеанс bash зсередини терміналу на mac. Я просто хочу таку саму поведінку, як якщо б я закрив термінальну програму і запустив її заново (усі змінні скидаються, .bash_profile і т.д. тощо).

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

Відповіді:


64

exec bash має замінити поточний процес оболонки на (новий екземпляр) bash.


2
Чи є bash в додатку термінала інтерактивною оболонкою і чи exec bashлише потім перезапускає цю інтерактивну оболонку? Крім того, чи можете ви пояснити, що саме робить команда exec і це варіанти? Дякую!
Маттіас

exec замінює поточний процес новим. Bash має дуже добре написану, але, на жаль, важку для пошуку сторінку; введіть man bash, знайдіть останній екземпляр рядка SHELL BUILTIN COMMANDS і потім прокрутіть вниз до exec. Коротше кажучи, передача -cпрапора запустить його без будь-яких змінних оточуючих середовищ (які, можливо, знадобляться для ваших цілей, я не знаю), а інші аргументи -l і -a, мабуть, не те, що ви хочете (вони здаються історичними / незрозумілі та специфічні особливості). Ви також можете використовувати exec для відкриття нових дескрипторів файлів у поточній оболонці, якщо ви не вийдете з команди.
Мюзер

Чи можете ви показати приклад того, як використовувати exec для відкриття нових дескрипторів файлів у поточній оболонці? А як щодо мого запитання про інтерактивну оболонку / вхід. Чи оболонка, запущена в терміналі, є інтерактивною оболонкою і чи торкається вся команда exec. Нарешті, схвалена відповідь на це питання рекомендує команду exec із прапором -l, але я не розумію, що це робить. Вибачте за запитання, я просто хочу зрозуміти команди, якими я користуюся.
Маттіас

1
Вибачте, так. Я не впевнений у Macs, але в світі Linux принаймні оболонки, запущені з графічного терміналу, (як правило) не є оболонками для входу, і ви лише перезапускаєте інтерактивну оболонку, а не сам термінал або оболонку входу. -lось аргумент, щоб башти і просто змушує його вести себе як оболонка входу. Відкриття дескрипторів файлів у поточній оболонці не має нічого спільного з вашим запитанням, але ви можете використовувати, exec 4<>test.txtнаприклад, для дескриптора файлу 4 точки до test.txt. Тоді в решті вашої оболонки ви можете зробити echo test>&4для виведення на test.txt.
Мюзер

1
@Muzer з причин, по яких я не можу сказати, що я повністю згоден, OSX вирішив, що емулятори терміналів GUI будуть запускати оболонки для входу .
terdon

1

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

Таким чином, команда середовище-агностик буде такою, exec $SHELLяка використовує змінну середовища, $SHELLяка зберігає оболонку за замовчуванням для користувача.

Крім того, зауважте, що Apple замінить bash на zsh в macOS Catalina, щоб досягти ефекту, що ОП шукає або працює, exec zshабо exec $SHELLбуде шлях після оновлення до macOS 10.15.

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