chsh -s /usr/bin/zsh not working
I'm trying to permanently change my shell to zsh using chsh
command, but it's not working.
zsh is installed (via apt) and works fine when I invoke it directly from a bash prompt terminal. But I can't get zsh to load in terminals by default, and chsh is doing something weird:
$ echo $SHELL
/bin/bash
$ which zsh
/usr/bin/zsh
$ chsh -s /usr/bin/zsh
Password:
$ echo $SHELL
/bin/bash
$ grep kurtosis /etc/passwd
kurtosis:x:1000:1000:kurtosis,,,:/home/kurtosis:/usr/bin/zsh
It appears chsh has managed to correctly change /etc/passwd, but not the $SHELL env variable. As such, new terminals always start in bash and not zsh.
I'm not sure where to look to troubleshoot this. .bashrc
, even though it's not invoked until the shell is specified? Any help appreciated.
You need to log out again for these changes to take effect. The shell defined in the /etc/passwd file is your login shell :-) So you need to log in actually for that.
There is a couple different problems that can occur here.
Problem 1. The default login shell hasn't been changed in /etc/passwd this can be solved by running chsh -s /usr/bin/zsh
which will update /etc/passwd
Problem 2. Bash is still used even after changing the default login shell using chsh -s /usr/bin/zsh
and confirming that your shell is actually set to zsh in /etc/passwd. This is caused by recycled ssh sessions. Logging out and logging back in won't fix the issue immediately, the sessions either need to expire or timeout, or you need to kill your session and reconnect. You can reboot, but below is an easier method which helps you find which session to kill.
Check what shell I'm using (/bin/bash) and what shell I should be using (/usr/bin/zsh):
asc@g1:~$ echo $SHELL
/bin/bash
asc@g1:~$ cat /etc/passwd|grep asc
asc:x:1000:1000:asc,,,:/home/asc:/usr/bin/zsh
Find out my terminal session information:
asc@g1:~$ who
asc pts/1 2020-01-28 13:08 (172.16.1.2)
asc@g1:~$ ps aux|grep ssh
root 1220 0.0 0.0 72300 6076 ? Ss Jan22 0:00 /usr/sbin/sshd -D
root 32879 0.0 0.0 107988 7224 ? Ss 13:08 0:00 sshd: asc [priv]
asc 33031 0.0 0.0 107988 3612 ? S 13:08 0:00 sshd: asc@pts/1
asc 47453 0.0 0.0 14428 1032 pts/1 S+ 13:21 0:00 grep --color=auto ssh
Kill my terminal session:
asc@g1:~$ kill 33031
Then SSH back in to the machine and you'll be using ZSH