I read that terminal is nothing but shell, and Unix provides different flavors of shells:

  • Bourne shell (sh)
  • C shell (csh)
  • TC shell (tcsh)
  • Korn shell (ksh)
  • Bourne Again shell (bash)

Questions:

  • When I open a terminal window, which shell is opened by default?
  • How do I check how many shells are installed?
  • How do I change the shell used from my account?
up vote 324 down vote accepted

You can type the following command in your terminal to see which shell you are using:

echo $0

The result will look something similar to the below if you are using the bash (Bourne Again Shell) terminal:

-bash
  • 1
    is 0 an environment variable? – Mi_Onim Feb 22 '16 at 17:21
  • 31
    @Mi_Onim $0 is the name of the running process. If you use it inside of a shell then it will return the name of the shell. If you use it inside of a script, it will be the name of the script. – kingmilo Jun 26 '16 at 4:49
  • 1
    NOTE: this won't work for interactive csh. % echo $0 No file for $0. , but it does work for tcsh – Sergiy Kolodyazhnyy Sep 18 '16 at 12:43
  • 1
    Doesn't work if when one is symlink. Like bash as sh – Anwar Dec 6 '16 at 17:43
  • 8
    @Anwar makes a good point, after you get the shell name from echo $0, ls -l `which <name>` to see if it is symlinked to another shell binary. – JivanAmara Feb 10 '17 at 23:38

To find the shell you have on the default environment you can check the value of the SHELL environment variable:

echo $SHELL

To find the current shell instance, look for the process (shell) having the PID of the current shell instance.

To find the PID of the current instance of shell:

echo "$$"

Now to find the process having the PID:

ps -p <PID>

Putting it together:

ps -p "$$"
  • 15
    $SHELL is the default shell for the system (or user), which is usually (but not necessarily) the shell that is actually being used at any given moment. – kingmilo Feb 28 '15 at 4:13
  • @kingmilo: Right you are, answer modified. – heemayl Feb 28 '15 at 4:24
  • I found this pretty useful when switching to a user through 'su - <username>', e.g. for setting up postgres, jenkins, ... – bully Oct 7 '15 at 11:20
  • echo $SHELL gave me /bin/csh and ps -p $$ gave me 22673 pts/1 00:00:00 bash. Kingmilo explained (above) why they are not the same. – 18446744073709551615 Oct 30 '17 at 10:32
  • @18446744073709551615 I have not said either that they are the same. Please read the answer carefully again; note the default and current wordings. – heemayl Oct 30 '17 at 13:34

$SHELL gives you the default shell. $0 gives you the current shell.

For example: I have bash as my default shell, which I use for my Terminal App. But for my iTerm2 app, I use the command as the window opens: /bin/ksh.

So my $0 gives me /bin/ksh on iTerm2. $SHELL gives me /bin/bash on iTerm2. $0,$SHELL gives me /bin/bash on Terminal

  • This is a nice disambiguation of the other top-voted answers. Thank you. – Michael Hoffmann Feb 14 at 18:58

To know which is the default shell for your user, you can run:

echo "$SHELL"

For example if you're using Bash you should get the following output:

/bin/bash

If you didn't change any configuration it should be Bash since Bash it's the default shell on Ubuntu.

  • /bin/sh is the Shell Command Language and not the Bourne Shell, please edit your answer. – kingmilo Feb 28 '15 at 4:07
  • @kingmilo There's no /bin/sh reference in my answer – kos Feb 28 '15 at 4:12
  • @kol there was before edit. Please also note $SHELL is the default shell for the system (or user), which is usually (but not necessarily) the shell that is actually being used at any given moment. – kingmilo Feb 28 '15 at 4:14
  • 1
    @kingmilo Reading the answer again i think i understand what is your concern, probably i didn't express myself well. I clarified the meaning of "currently" in my answer – kos Feb 28 '15 at 4:49
  • 1
    @frederickjh fish is a bit of an odd one out here. The $$ variable is actually defined by POSIX and will work on the vast majority of shells. Fish has decided not to follow the standard here so I think it's fair to ignore it. I can confirm that $$ works as expected in sh, dash, bash, zsh, ksh, ash, tcsh and csh. In fact, off the top of my head I can't think of any other shell except fish where it doesn't work. – terdon Aug 18 '16 at 9:02

The other answers tend to be using shell specific features, but we are trying to discover which shell we are using, so they assume the answer to the problem. For example none of the answers will work on fish.

sh -c 'ps -p $$ -o ppid=' | xargs ps -o cmd= -p

Instead use the $$ syntax in an invocation of sh, but then we are looking for the PPID not the PID. Use the PPID to find the cmd.

sh -c 'ps -p $$ -o ppid=' | xargs -i readlink -f /proc/\{\}/exe

Thanks for improvement @muru

  • 2
    You ca use ppid=/cmd=to omit the headers (and so the tail -1s), and consider looking at /proc/.../exe to see what file is being run (since the cmd output can be manipulated by whatever ran the shell). – muru Apr 6 at 4:07
  • 1
    Apparently this does not work in busybox, due to non posix compliance: ref: github.com/broadinstitute/cromwell/pull/… – Evan Benn Apr 30 at 5:04

The original post asked three questions. The answers given do cover the first question, "When I open a terminal window, which shell is opened by default?" They also answer a question which was NOT asked, namely "How can I find out which shell is currently running in the terminal?" However, as far as I can see nobody has answered either the second or third questions originally asked, namely "How do I check how many shells are installed?" and "How do I change the shell used from my account?"

  • To answer "How do I check how many shells are installed?" the following command will list all the available shells:

cat /etc/shells

For example, on a default installation of Ubuntu 18.10 this gives:

# /etc/shells: valid login shells

/bin/sh

/bin/dash

/bin/bash

/bin/rbash

However, by default sh is a symbolic link to dash, while rbash links to bash with the option -r ("restricted bash") so there are actually only two shells, not four as the above list suggests. The following command will show you whether any of the listed shells are in fact symbolic links, and if so where they link to: ls -l /bin

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.