Zrestartować bash z terminala bez restartowania aplikacji terminala (Mac)?

46

Rozejrzałem się i szukałem odpowiedzi na to pytanie, ale wydaje mi się, że nie mogę go znaleźć (co jest dziwne).

Moje pytanie brzmi: czy istnieje jakikolwiek prosty sposób na ponowne uruchomienie sesji bash z poziomu terminala na komputerze Mac. Chcę tylko tego samego zachowania, jak gdybym zamknął aplikację terminalową i uruchomił ją ponownie (wszystkie zmienne zostały zresetowane, źródło .bash_profile itp.).

Wiem, jak zdobyć .bash_profile, ale nie tego chcę. Jednym z powodów, dla których chcę to zrobić, jest to, że wtyczka do mojego monitu bash ma kod, który zapobiega wielokrotnemu ładowaniu kolorów. Dlatego pozyskiwanie .bash_profile nie przeładowuje zmiennych kolorów i muszę ponownie uruchomić aplikację terminalową, aby uzyskać zmiany.

Mattias
źródło

Odpowiedzi:

64

exec bash powinien zastąpić bieżący proces powłoki (nowym wystąpieniem) bash.

Muzer
źródło
2
Czy bash w aplikacji terminalowej jest interaktywną powłoką i czy exec bashwtedy restartuje tylko tę interaktywną powłokę? Czy potrafisz też dokładnie wyjaśnić, co robi polecenie exec i jakie są opcje? Dzięki!
Mattias
exec zastępuje bieżący proces nowym. Bash ma bardzo dobrze napisaną, ale niestety trudną do przeszukania stronę; wpisz man bash, znajdź ostatnią instancję ciągu SHELL BUILTIN COMMANDS, a następnie przewiń w dół, aby wykonać. Krótko mówiąc, przekazanie -cflagi spowoduje uruchomienie jej bez żadnych zmiennych środowiskowych (które mogą być wymagane do twoich celów, nie wiem), a inne argumenty -l i -a prawdopodobnie nie są tymi, których chcesz (wydają się być historyczne / niejasne i specyficzne funkcje). Możesz także użyć exec do otwierania nowych deskryptorów plików w bieżącej powłoce, jeśli zrezygnujesz z polecenia.
Muzer
Czy możesz pokazać przykład użycia exec do otwierania nowych deskryptorów plików w bieżącej powłoce? A co z moim pytaniem na temat powłoki interaktywnej / logowania. Czy powłoka jest uruchamiana w terminalu jako powłoka interaktywna i czy wszystkie polecenia exec dotykają. Wreszcie ten zatwierdzona odpowiedź pytanie zalecają polecenia exec z -l flagą, ale nie rozumiem, co robi. Przepraszam, że tyle pytam, chcę tylko zrozumieć polecenia, których używam.
Mattias
1
Przepraszam tak Nie jestem pewien co do komputerów Mac, ale w świecie Linuksa przynajmniej powłoki uruchamiane z terminala graficznego (zwykle) nie są powłokami logowania, a restartujesz tylko powłokę interaktywną, a nie sam terminal lub powłokę logowania. -loto argument do bashowania i sprawia, że ​​zachowuje się jak powłoka logowania. Otwieranie deskryptorów plików w bieżącej powłoce nie ma nic wspólnego z twoim pytaniem, ale możesz exec 4<>test.txtna przykład użyć, aby deskryptor pliku 4 wskazywał na test.txt. Następnie w pozostałej części powłoki możesz zrobić echo test>&4plik wyjściowy do test.txt.
Muzer
1
@Muzer z powodów, z których nie mogę się całkowicie zgodzić, OSX zdecydował, że emulatory terminali GUI będą uruchamiać powłoki logowania .
terdon
1

Przyjęta odpowiedź jest świetna dla powłoki używającej bash, o co również poprosił OP, jednak używam Terminala na macOS z powłoką inną niż domyślna (zsh) i uruchomienie polecenia exec bashoczywiście nie daje pożądanego efektu : uruchamia bash zamiast mojej domyślnej powłoki.

Tak więc komenda environment-agnostic exec $SHELLwykorzystuje zmienną środowiskową, $SHELLktóra przechowuje domyślną powłokę dla użytkownika.

Należy również pamiętać, że Apple będzie zastąpienie bash z zsh MacOS Catalina więc mieć wpływu PO szuka działa albo exec zshczy exec $SHELLbędzie droga po aktualizacji do MacOS 10.15.

phip
źródło