Search code examples
shellunixposix

How do I tell what type my shell is


How can I tell what type my shell is? ie, whether it's traditional sh, bash, ksh, csh, zsh etc.

Note that checking $SHELL or $0 won't work because $SHELL isn't set by all shells, so if you start in one shell and then start a different one you may still have the old $SHELL.

$0 only tells you where the shell binary is, but doesn't tell you whether /bin/sh is a real Bourne shell or bash.

I presume that the answer will be "try some features and see what breaks", so if anyone can point me at a script that does that, that'd be great.


Solution

  • This is what I use in my .profile:

    # .profile is sourced at login by sh and ksh. The zsh sources .zshrc and
    # bash sources .bashrc. To get the same behaviour from zsh and bash as well
    # I suggest "cd; ln -s .profile .zshrc; ln -s .profile .bashrc".
    # Determine what (Bourne compatible) shell we are running under. Put the result
    # in $PROFILE_SHELL (not $SHELL) so further code can depend on the shell type.
    
    if test -n "$ZSH_VERSION"; then
      PROFILE_SHELL=zsh
    elif test -n "$BASH_VERSION"; then
      PROFILE_SHELL=bash
    elif test -n "$KSH_VERSION"; then
      PROFILE_SHELL=ksh
    elif test -n "$FCEDIT"; then
      PROFILE_SHELL=ksh
    elif test -n "$PS3"; then
      PROFILE_SHELL=unknown
    else
      PROFILE_SHELL=sh
    fi
    

    It does not make fine distinctions between ksh88, ksh95, pdksh or mksh etc., but in more than ten years it has proven to work for me as designed on all the systems I were at home on (BSD, SunOS, Solaris, Linux, Unicos, HP-UX, AIX, IRIX, MicroStation, Cygwin.)

    I don't see the need to check for csh in .profile, as csh sources other files at startup. Any script you write does not need to check for csh vs Bourne-heritage because you explicitly name the interpreter in the shebang line.