Change default shell on MSYS2
I just ran into this problem. To get zsh running I did this:
- Installed MSYS2
- From the directory I installed MSYS2, I ran
mingw32_shell.bat
- Upgraded all installed packages by running
pacman -Syu
- Installed zsh and curl by running
pacman -Sy zsh curl
- Closed the MinGW shell by running
exit
- I did not runzsh
immediately after installation. - Edited msys2_shell.bat, mingw32_shell.bat, and mingw64_shell.bat and changed every instance of:
start %WD%mintty -i /msys2.ico /usr/bin/bash --login %*
to:start %WD%mintty -i /msys2.ico /usr/bin/zsh --login %*
(on line 39 as of 2015-09-23) - Ran
mingw32_shell.bat
- At the zsh configuration menu I select
0
to create the .zshrc file.
When configuration finished I saw:
zsh-newuser-install:1119: command not found: rm
Which didn't look right... since rm
should never net be found on a healthy *nix system (I'm guessing it's a bug with MSYS2's zsh package), but everything ran fine after that.
The first time I tried this when I ran opened up a batch file to create a new session I received an error about zsh's memory space already being occupied. To fix this I closed all open MinTTY windows and ran the autorebase.bat
file in the MSYS2 installation directory. Everything worked after that.
Then I installed oh-my-zsh. Using:
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
I ran into this using the newer msys2-launcher, that provides .exe
launchers rather than batch files.
For this, it was simply a matter of changing the .ini
files alongside the launchers inside the Msys2 root directory (for a 64-bit installation, it might contain msys2.ini
, mingw32.ini
and mingw64.ini
). For each of those ini files, add a line to set the shell:
SHELL=/usr/bin/zsh
Edit /etc/nsswitch.conf
, and change the setting below:
db_shell: /bin/zsh
When changing default shell is not supported, one way to use the shell you like is to start it immediately when the default shell starts.
For example, just write zsh
to ~/.bashrc
, and when bash starts, it will run zsh for you. How ever a stray bash process is left running, and you have to quit shell twice when logging out.
To make it better, write exec zsh
instead of zsh
, this way, the bash process is completely replaced with a zsh process.
This method is not perfect but it should work well in most cases. Compared to changing hard-coded values, it may cause less compatibility issues.
It is first mentioned in this answer on StackOverflow.
My install did not have the files mentioned in the accepted answer (msys2_shell.bat
, mingw32_shell.bat
, and mingw64_shell.bat
).
Instead my Win10 system install of MSYS2 (using the installer file msys2-x86_64-20161025.exe
) has a single file, msys2_shell.cmd
with the line:
set "LOGINSHELL=bash"
I changed bash
to zsh
. Seems to work so far.