Changer le shell par défaut sur MSYS2

14

Je veux changer le shell par défaut de MSYS2 de bashà zsh.

J'ai essayé chsh- non disponible dans MSYS2.
L'édition /etc/passwdne fait rien. Cela semble ignoré.

J'ai jeté un coup d'œil aux scripts de commandes dans le répertoire racine de MSYS2, et bashje suis codé en dur. J'ai changé tous les /usr/bin/bashen /usr/bin/zsh, ce qui fonctionnait bien, jusqu'à ce que j'essaie d'utiliser MinGW.

Où puis-je changer le shell de MSYS2 (correctement), si possible?

sorbet
la source

Réponses:

8

Je viens de rencontrer ce problème. Pour lancer zsh, j'ai fait ceci:

  • MSYS2 installé
  • Depuis le répertoire où j'ai installé MSYS2, j'ai couru mingw32_shell.bat
  • Mise à niveau de tous les packages installés en exécutant pacman -Syu
  • Zsh installé et curl en exécutant pacman -Sy zsh curl
  • Fermé le shell MinGW en exécutant exit- je n'ai pas exécuté zshimmédiatement après l'installation.
  • Modifié msys2_shell.bat, mingw32_shell.bat et mingw64_shell.bat et changé chaque instance de: start %WD%mintty -i /msys2.ico /usr/bin/bash --login %* en: start %WD%mintty -i /msys2.ico /usr/bin/zsh --login %* (sur la ligne 39 à partir du 2015-09-23)
  • Ran mingw32_shell.bat
  • Dans le menu de configuration zsh, je choisis 0de créer le fichier .zshrc.

Une fois la configuration terminée, j'ai vu:

zsh-newuser-install:1119: command not found: rm

Ce qui ne semblait pas correct ... car rmil ne devrait jamais y avoir de net sur un système * nix sain (je suppose que c'est un bogue avec le package zsh de MSYS2), mais tout s'est bien passé après cela.

La première fois que j'ai essayé cela lorsque j'ai exécuté ouvert un fichier de commandes pour créer une nouvelle session, j'ai reçu une erreur sur l'espace mémoire de zsh déjà occupé. Pour résoudre ce problème, j'ai fermé toutes les fenêtres MinTTY ouvertes et j'ai exécuté le autorebase.batfichier dans le répertoire d'installation de MSYS2. Tout a fonctionné après ça.

Ensuite, j'ai installé oh-my-zsh. En utilisant:

sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

livingstaccato
la source
J'essayais de faire essentiellement cette méthode, et je ne pouvais pas faire fonctionner le poisson sans erreur.
leetNightshade
1
Le rmest en fait vraiment innocent. La fin du /usr/share/zsh/functions/Newuser/zsh-newuser-installscript contient un rm -f $tmpfile*pour nettoyer après lui-même. C'est exactement la même chose dans mon installation Fedora actuelle /usr/share/zsh/5.7.1/functions/zsh-newuser-install.
FeRD
24

J'ai rencontré cela en utilisant le nouveau lanceur msys2, qui fournit des .exelanceurs plutôt que des fichiers batch.

Pour cela, il s'agissait simplement de changer les .inifichiers aux côtés des lanceurs dans le répertoire racine Msys2 (pour une installation 64 bits, il pourrait contenir msys2.ini, mingw32.iniet mingw64.ini). Pour chacun de ces fichiers ini, ajoutez une ligne pour définir le shell:

SHELL=/usr/bin/zsh
Alan Pearce
la source
C'est le moyen direct de définir zshcomme shell. Pour configurer oh-my-zsh, on pourrait envisager cette méthode - la skelpartie ne s'applique pas vraiment à msys2 pour autant que je vois.
TNT
1
C'est la bonne réponse pour les msys2 plus récents à partir de juillet 2018. La réponse acceptée ne fonctionne plus.
GaryO
ne fonctionne plus (14/03/19)
letroll
5

Modifiez /etc/nsswitch.confet modifiez le paramètre ci-dessous:

db_shell: /bin/zsh
Hippopotame
la source
Cela fonctionne mais semble une version plutôt hackeuse de la solution d'Alan Pearce.
TNT
Je ne pouvais pas faire fonctionner cela en essayant d'utiliser du poisson.
leetNightshade
J'ai trouvé cette réponse ici aussi: github.com/elieux/msys2-launcher/issues/… mais la réponse d'Alan Pearce semble plus agréable. Les deux œuvres cependant, et vous pouvez également définir le shell dans le msys2_shell.cmdfichier de chauve - souris, mais le changer dans le .cmdfichier n'affecte pas le shell si vous devez commencer à partir de l' un des .exes
Jose
4

Lorsque la modification du shell par défaut n'est pas prise en charge, une façon d'utiliser le shell que vous aimez est de le démarrer immédiatement au démarrage du shell par défaut.

Par exemple, écrivez simplement zshà ~/.bashrc, et quand bash démarre, il exécutera zsh pour vous. Cependant, un processus bash errant est toujours en cours d'exécution et vous devez quitter le shell deux fois lors de la déconnexion. Pour l'améliorer, écrivez exec zshau lieu de zsh, de cette façon, le processus bash est complètement remplacé par un processus zsh.

Cette méthode n'est pas parfaite mais elle devrait bien fonctionner dans la plupart des cas. Comparé à la modification de valeurs codées en dur, cela peut entraîner moins de problèmes de compatibilité.

Il est d'abord mentionné dans cette réponse sur StackOverflow .

wzhd
la source
Rien de bien ni de fantaisie à ce sujet, mais cela fonctionne avec le moins de bruit.
leetNightshade
3

Mon installation n'a pas que les fichiers mentionnés dans la réponse acceptée ( msys2_shell.bat, mingw32_shell.batet mingw64_shell.bat).

Au lieu de cela, mon installation système Win10 de MSYS2 (en utilisant le fichier d'installation msys2-x86_64-20161025.exe) a un seul fichier, msys2_shell.cmdavec la ligne:

set "LOGINSHELL=bash"

J'ai changé bashpour zsh. Semble fonctionner jusqu'à présent.

xtian
la source
votre solution n'a pas fonctionné pour moi sur Win7 avez-vous fait d'autres choses après cela?
letroll
1
Désolé, je n'ai pas d'autres informations. Je suis passé au WSL, qui fonctionne pour mes besoins. Bonne chance.
2019
cela a fonctionné pour moi sur win10
Jose
Cependant, si vous devez démarrer msys2 à partir de l'un des .exefichiers, cela ne définira pas le shell, pour cela, regardez la réponse d'Alan Pearce
Jose
1

J'ai une solution mais elle nécessite que vous utilisiez ConEmu au lieu de tout autre terminal que vous utilisez actuellement. Essayez, à mon avis, c'est la meilleure application de terminal sur Windows.

Tout d'abord, vous devrez installer zsh à l'aide de pacman. Je suppose que vous êtes déjà allé aussi loin. Ensuite, vous devrez installer ConEmu (ce que vous pouvez faire avec Chocolatey ou simplement en téléchargeant le programme d'installation à partir du site conemu). Dans les paramètres ConEmu, sous «Tâches», vous devez ajouter une nouvelle tâche. Il en a probablement déjà un appelé Bash::Msys2-64ou quelque chose comme ça, alors peut-être que vous en appellerez un Zsh::Msys2-64. Le nom est en tout cas arbitraire. Dans la zone «Commandes» de cette nouvelle tâche, vous pouvez essentiellement copier la commande à partir de Bash::Msys2-64et la remplacer le zsh.execas échéant. Le mien est comme:

set CHERE_INVOKING=1 & %ConEmuDrive%\msys64\usr\bin\zsh.exe --login -i -new_console:C:"%ConEmuDrive%\msys64\msys2.ico"

Ensuite, dans les options de «démarrage» de ConEmu, vous pouvez définir cela comme votre tâche de démarrage afin que l'ouverture de ConEmu vous amène directement dans votre Zsh à chaque fois. Évidemment, vous pouvez également définir un combo de touches pour l'ouvrir ou toute autre tâche dans un nouvel onglet ou tout ce que vous voulez. ConEmu a beaucoup d'options, donc je suis sûr que vous pourrez le configurer comme vous le souhaitez.

Okonomiyaki3000
la source
0

Les développeurs MSYS2 continuent évidemment de modifier leur configuration, car dans les dernières installations, la msys2_shellcommande installée dans Windows pour lancer le ou les environnements MSYS2 accepte un -shellargument.

Ainsi, pour utiliser un autre shell, vous pouvez modifier les propriétés d'un ou plusieurs lanceurs pour MSYS2 / MinGW 32 / MinGW 64 et mettre à jour la cible à ajouter -shell zshou autre. (Si le shell est $PATHsuffisant pour l'environnement MSYS, vous n'avez pas besoin du chemin complet.)

Ainsi, par exemple pour le lanceur "MSYS2 MinGW 64-bit" dans "MSYS2 64bit" sur mon menu Démarrer Win7:

Avant
Cible: C:\msys64\msys2_shell.cmd -mingw64
Après
Cible: C:\msys64\msys2_shell.cmd -mingw64 -shell zsh

Cela semble être le moyen le plus simple et le plus compatible pour passer de manière permanente, car vos modifications ne seront pas effacées par les mises à niveau ou autre.

Curieusement, les lanceurs ne respectent pas les variables d'environnement, les entrées de registre, etc. À moins d' -shellêtre transmis sur la ligne de commande pour le remplacer, la LOGINSHELL=bashvaleur par défaut qu'il force initialement sera utilisée.

FeRD
la source
0

EDIT: ce qui suit s'applique aux versions antérieures de MSYS2. Depuis le 2020-01-21, il n'est plus nécessaire. La réponse de FeRD semble fonctionner le mieux.

Je voulais utiliser du poisson au lieu de bash. Malheureusement, la plupart des méthodes ici n'ont pas fonctionné, peut-être parce que la syntaxe du poisson est si différente.

Ce qui a le mieux fonctionné, c'est l'idée de wzhd de courir exec fishen premier lorsque bash commence. Il y avait toujours un problème, cependant: si je voulais utiliser bash, je devais éditer .bashrcpour supprimer cette ligne car même si je l'exécutais à partir de fish, cela ne ferait que démarrer une autre instance de fish.

La meilleure chose à faire est de s'assurer qu'elle exec fishs'exécute au début de msys2, mais pas à chaque démarrage de bash.

La façon dont j'ai trouvé est à travers le fichier msys2_shell.cmddans le dossier d'installation de msys2. J'ai trouvé ces lignes:

set SHELL_ARGS=

:collectparams

if not "x%~1" == "x" set SHELL_ARGS=%SHELL_ARGS% %1& shift& goto :collectparams

Il semble qu'ils définissent des paramètres à passer à bash dès qu'il commence, mais uniquement lorsque ce script s'exécute (contrairement .bashrc). J'ai donc ajouté cette ligne juste après:

set SHELL_ARGS=%SHELL_ARGS% -c "exec fish"

Tout semble aller bien jusqu'à présent. Le démarrage de msys2 remplace bash par fish dès que le premier termine le chargement, mais si j'ai besoin d'une ligne de commande bash, je peux toujours le démarrer avec bash.

George T
la source