35

I am trying to change my default shell from bash to zsh in cygwin.

  1. The normal unix command chsh isn't available on cygwin
  2. The etc/passwd file it seems isn't used anymore in existing versions of cygwin.

So how else can the default shell be changed ?

gyaani_guy
  • 431
  • 2
  • 6
  • 15

5 Answers5

32

If you run mintty.exe directly or run Cygwin Terminal from the start menu or desktop (which is a shortcut to mintty.exe), you can set the SHELL environment variable in Windows to /usr/bin/zsh.

On Windows 7:

  1. Press Windows key.
  2. Start typing "environment".
  3. When it appears, select "Edit environment variables for your account".

The rest should be self-explanatory.

dc46and2
  • 433
  • 4
  • 5
  • 6
    This seriously needs more up-votes. I've never seen this documented anywhere, and it's obviously the intended method. – Kevin Mills Feb 09 '17 at 01:04
  • 1
    For those who don't want to rely on search to find the appropriate panel, right-click the Start menu and select "System" to launch the System control panel. Then click "Advanced system settings" from the left-side column. On the "System Properties" window that pops up, click "Environment Variables..." to launch the environment variable editor. – David C. Apr 13 '17 at 19:40
  • Worked perfectly! – bkunzi01 Jul 16 '17 at 21:56
  • 1
    Choose 'User Variables for xxxx'. Then Add New Variable, Name SHELL, Value /usr/bin/zsh . Launch a new Mintty Window and you start in zsh .. no need to restart windows – zzapper Aug 19 '21 at 09:07
  • This does appear to be the slickest way to specify the desired Cygwin shell. Is it documented? Couldn't find it searching the cygwin site. – Winston Smith Apr 12 '22 at 23:06
  • It's a documented feature of mintty. See https://mintty.github.io/mintty.1.html. There are other ways to get to the Cygwin terminal, without using mintty, so this is not a universal solution. – dc46and2 Apr 20 '22 at 17:35
26

The answer depends on how you start Cygwin.

If you start Cygwin with Cygwin.bat, modify the last line of /Cygwin.bat (usually C:\cygwin\ or C:\cygwin64\).

If you start Cygwin with mintty, then add the shell as a parameter: mintty /usr/bin/zsh -

Steven
  • 27,531
  • 11
  • 97
  • 118
  • 2
    Thank you, I am using Conemu. Had to change the `sh.exe` to `zsh.exe` in Conemu Settings > startup > tasks > bash Cygwin Bash > `set CHERE_INVOKING=1 & %ConEmuDrive%\CygWin\bin\sh.exe --login -i` – gyaani_guy Jul 14 '15 at 17:31
  • @gyaani_guy I am just using ConEmu to execute `CygWin\bin\zsh.exe`. `sh.exe --login` will launch Bash, how do you change that? Or does it not matter anyway? I imagine `sh.exe --login` is unnecessarily executing `sh` before `zsh`... – deed02392 Oct 19 '16 at 10:10
  • @deed02392 I am not sure I understand.. but the exact command I am using is `set CHERE_INVOKING=1 & %ConEmuDrive%\CygWin\bin\zsh.exe --login -i` hth – gyaani_guy Oct 19 '16 at 18:18
  • @gyaani_guy thanks, I was confused because in your first comment you seemed to imply that you start zsh with `sh.exe`. Now I realise I just didn't read your message correctly :-) – deed02392 Oct 20 '16 at 09:45
  • 4
    The mintty example didn't quite work for me. It had issues until I made it a login shell by adding `-l`: `mintty.exe -i /Cygwin-Terminal.ico /usr/bin/zsh -l -` – Morgan May Nov 02 '16 at 03:32
  • See [this answer](https://superuser.com/a/1134672/7444) for a better solution. – exhuma Mar 14 '19 at 09:22
  • This is the only answer that directly allows you to directly pass the `-l` flag to `zsh`, so this is the only answer that allows you to have a proper *login* `zsh` instance started. – mtraceur Jul 03 '19 at 20:41
17

Copied from my answer on Stack Overflow:


Instead of creating a passwd file, which Cygwin recommends against1, you could edit /etc/nsswitch.conf. Add or edit the following line:

db_shell: /usr/bin/fish

The down/up side of this method is that, if you have multiple users, this change affects all of them. The up/up side is that it's dead simple. The only catch is that you have to restart Cygwin.

If you do use mkpasswd after this change, it will use your new default shell for all users that are allowed to log on.


1 The mkpasswd documentation says this:

Don't use this command to generate a local /etc/passwd file, unless you really need one. See the Cygwin User's Guide for more information.

I can't really find any solid reasoning in the user's guide, other than a mention that you'll have to regenerate the /etc/passwd and /etc/group files if your users and groups change, which I suppose is a decent enough reason. I can say that the process is somewhat error prone for newbies.

P Daddy
  • 419
  • 1
  • 6
  • 6
7

This is a hack: put this as the first line of your ~/.bash_profile:

exec zsh
glenn jackman
  • 25,463
  • 6
  • 46
  • 69
0

My hosting service, dreamhost.com, has an option box in their user edit screen. It can choose among four different shells and looks somewhat like this

User Type: (Click one of these three buttons) 
  * FTP user - allows login via FTP only.   
  * SFTP user - allows login via SFTP only.
  * Shell user - allows login via both SSH and FTP. 
        Shell Type: ____/usr/bin/tcsh_____  
Disallow FTP?:  ___