Skip to content

Bash startup modes

Login shell

As a "login shell", Bash reads and sets (executes) the user's profile from /etc/profile and one of ~/.bash_profile, ~/.bash_login, or ~/.profile (in that order, using the first one that's readable!).

When a login shell exits, Bash reads and executes commands from the file ~/.bash_logout, if it exists.

Why an extra login shell mode? There are many actions and variable sets that only make sense for the initial user login. That's why all UNIX® shells have (should have) a "login" mode.

Methods to start Bash as a login shell:

  • the first character of argv[0] is - (a hyphen): traditional UNIX® shells start from the login binary
  • Bash is started with the -l option
  • Bash is started with the --login option

Methods to test for login shell mode:

Related switches:

  • --noprofile disables reading of all profile files

Interactive shell

When Bash starts as an interactive non-login shell, it reads and executes commands from ~/.bashrc. This file should contain, for example, aliases, since they need to be defined in every shell as they're not inherited from the parent shell.

The feature to have a system-wide /etc/bash.bashrc or a similar system-wide rc-file is specific to vendors and distributors that ship their own, patched variant of Bash. The classic way to have a system-wide rc file is to source /etc/bashrc from every user's ~/.bashrc.

Methods to test for interactive-shell mode:

  • the special parameter $- contains the letter i (lowercase I)

Related switches:

  • -i forces the interactive mode
  • --norc disables reading of the startup files (e.g. /etc/bash.bashrc if supported) and ~/.bashrc
  • --rcfile defines another startup file (instead of /etc/bash.bashrc and ~/.bashrc)

SH mode

When Bash starts in SH compatiblity mode, it tries to mimic the startup behaviour of historical versions of sh as closely as possible, while conforming to the POSIX® standard as well. The profile files read are /etc/profile and ~/.profile, if it's a login shell.

If it's not a login shell, the environment variable http://wiki.bash-hackers.org/syntax/shellvars is evaluated and the resulting filename is used as the name of the startup file.

After the startup files are read, Bash enters the http://wiki.bash-hackers.org/scripting/bashbehaviour.

Bash starts in sh compatiblity mode when:

  • the base filename in argv[0] is sh (

    NB: /bin/sh may be linked to /bin/bash, but that doesn't mean it acts like /bin/bash 

    )