Redémarrez bash depuis un terminal sans redémarrer l’application terminal (mac)?

46

J'ai regardé autour de moi et mordu pour trouver une réponse à cette question mais je ne semble pas la trouver (ce qui est étrange).

Ma question est la suivante: existe-t-il un moyen simple de redémarrer la session bash à partir du terminal sur mac? Je veux juste le même comportement que si je fermais l'application de terminal et la redémarrais (toutes les variables réinitialisées, .bash_profile provenant de etc.).

Je sais comment .bash_profile, mais ce n'est pas ce que je veux. Une des raisons pour lesquelles je souhaite procéder est qu’un plugin pour mon invite bash contient un code qui empêche le chargement des couleurs plusieurs fois. Par conséquent, l'approvisionnement en .bash_profile ne recharge pas les variables de couleur et je dois redémarrer l'application de terminal pour que les modifications prennent effet.

Mattias
la source

Réponses:

65

exec bash devrait remplacer le processus shell actuel par (une nouvelle instance de) bash.

Muzer
la source
2
Bash dans l’application terminal est-il un shell interactif et ne exec bashredémarre-t-il alors ce shell interactif? Aussi, pouvez-vous expliquer exactement ce que fait la commande exec et ses options? Merci!
Mattias
exec remplace le processus actuel par un nouveau. Bash a une page de manuel très bien écrite mais malheureusement difficile à rechercher; type man bash, recherchez la dernière instance de la chaîne SHELL BUILTIN COMMANDS, puis faites défiler jusqu'à exec. En bref, passer le -cdrapeau le fera fonctionner sans aucune variable d’environnement (ce qui pourrait être nécessaire pour vos besoins, je ne sais pas), et les autres arguments -l et -a ne sont probablement pas des choses que vous voulez (elles semblent historiques). / caractéristiques obscures et spécifiques). Vous pouvez également utiliser exec pour ouvrir de nouveaux descripteurs de fichier dans le shell actuel, si vous oubliez la commande.
Muzer
Pouvez-vous montrer un exemple d'utilisation de exec pour ouvrir de nouveaux descripteurs de fichier dans le shell actuel? Et que dire de ma question sur le shell interactif / de connexion. Le shell exécuté dans le terminal est-il un shell interactif auquel toutes les commandes exec se touchent. Enfin, la réponse approuvée de cette question recommande la commande exec avec l'indicateur -l, mais je ne comprends pas ce qu'elle fait. Désolé de demander autant, je veux juste comprendre les commandes que j'utilise.
Mattias
1
Désolé, oui. Je ne suis pas sûr des Macs, mais dans le monde Linux au moins, les shells exécutés à partir d’un terminal graphique ne sont (généralement) pas des shells de connexion, et vous ne faites que redémarrer le shell interactif et non le terminal lui-même ou votre shell de connexion. -lvoici un argument pour bash et le fait se comporter comme un shell de connexion. L'ouverture de descripteurs de fichier dans le shell actuel n'a rien à voir avec votre question, mais vous pouvez utiliser, exec 4<>test.txtpar exemple, le pointeur de fichier à 4 points vers test.txt. Ensuite, dans le reste de votre shell, vous pouvez echo test>&4afficher le fichier test.txt.
Muzer
1
@Muzer pour des raisons avec lesquelles je ne peux pas dire que je suis entièrement d'accord, OSX a décidé que les émulateurs de terminaux à interface graphique exécuteraient des shells de connexion .
terdon
1

La réponse acceptée est excellente pour un shell qui utilise bash, ce qui est également ce que l'OP a demandé. Cependant, j'utilise Terminal sur macOS avec un shell autre que celui par défaut (zsh) et l'exécution de la commande exec bashn'a évidemment pas l'effet souhaité. : il lance bash au lieu de mon shell par défaut.

Ainsi, la commande exec $SHELLindépendante de l'environnement utilise la variable d'environnement $SHELLqui stocke le shell par défaut pour l'utilisateur.

Notez également qu'Apple remplacera bash par zsh dans macOS Catalina afin d’obtenir l’effet recherché par le PO, exec zshou exec $SHELLsera le moyen à utiliser après la mise à jour vers macOS 10.15.

phip
la source