Reiniciar o bash a partir do terminal sem reiniciar o aplicativo de terminal (mac)?

46

Eu olhei em volta e procurei uma resposta para essa pergunta, mas não a acho (o que é estranho).

Minha pergunta é, existe alguma maneira simples de reiniciar a sessão bash de dentro do terminal no mac. Eu só quero o mesmo comportamento como se eu fechasse o aplicativo de terminal e o iniciasse novamente (todas as variáveis ​​são redefinidas, .bash_profile de origem etc).

Eu sei como fonte .bash_profile, mas não é isso que eu quero. Uma das razões pelas quais desejo fazer isso é porque um plug-in para o meu prompt do bash possui um código que impede que as cores sejam carregadas várias vezes. Portanto, a fonte .bash_profile não recarrega as variáveis ​​de cores e eu tenho que reiniciar o aplicativo de terminal para obter alterações.

Mattias
fonte

Respostas:

64

exec bash deve substituir o processo atual do shell por (uma nova instância de) bash.

Muzer
fonte
2
O bash no aplicativo de terminal é um shell interativo e exec bashsó reinicia esse shell interativo? Além disso, você pode explicar exatamente o que o comando exec faz e suas opções? Obrigado!
Mattias
exec substitui o processo atual por um novo. O Bash tem uma página de manual muito bem escrita, mas infelizmente difícil de pesquisar; digite man bash, localize a última instância da sequência SHELL BUILTIN COMMANDS e role para baixo até exec. Em suma, passar a -cbandeira o executará sem nenhuma variável de ambiente (o que pode ser necessário para seus propósitos, eu não sei), e os outros argumentos -l e -a provavelmente não são o que você deseja (eles parecem históricos / recursos obscuros e específicos). Você também pode usar exec para abrir novos descritores de arquivo no shell atual, se você deixar o comando.
Muzer
Você pode mostrar um exemplo de como usar exec para abrir novos descritores de arquivo no shell atual? E a minha pergunta sobre o shell interativo / de login. O shell executado no terminal é um shell interativo e é o que todo o comando exec toca. Por fim, a resposta aprovada desta pergunta recomenda o comando exec com o sinalizador -l, mas não entendo o que ele faz. Desculpe por pedir tanto, eu só quero entender os comandos que eu uso.
Mattias
1
Desculpe sim. Não tenho certeza sobre Macs, mas no mundo Linux, pelo menos, os shells executados em um terminal gráfico (geralmente) não são shells de login, e você está apenas reiniciando o shell interativo e não o próprio terminal ou o seu shell de login. -lAqui está um argumento para bash e apenas faz com que ele se comporte como um shell de login. Abrir descritores de arquivo no shell atual não tem nada a ver com sua pergunta, mas você pode usar, exec 4<>test.txtpor exemplo, para fazer com que o descritor de arquivo 4 aponte para test.txt. Em seguida, no restante do seu shell, você pode fazer echo test>&4a saída para test.txt.
Muzer
1
@Muzer, por razões que não posso dizer que concordo totalmente, a OSX decidiu que os emuladores de terminal da GUI executam shells de login .
terdon
1

A resposta aceita é ótima para um shell que está usando o bash, que também é o que o OP pediu, no entanto, estou usando o Terminal no macOS com um shell não padrão (zsh) e executar o comando exec bashobviamente não tem o efeito desejado : inicia o bash em vez do meu shell padrão.

Portanto, o comando independente de ambiente seria o exec $SHELLque utiliza a variável de ambiente $SHELLque armazena o shell padrão para o usuário.

Além disso, observe que a Apple substituirá o bash pelo zsh no macOS Catalina, para que o OP esteja procurando a execução exec zshou exec $SHELLserá o caminho a seguir após a atualização para o macOS 10.15.

phip
fonte