What is the difference between a 'Login' and an 'Interactive' bash shell

What is the difference between a ‘Login’ and an ‘Interactive’ bash shell? I have quoted Wikipedia below but can anybody give a better answer?

EDIT: This is a community wiki so maybe rather than voting to close you could provide examples of which situations call for which type of $SHELL

Startup scripts

When Bash starts, it executes the commands in a variety of different scripts.

When Bash is invoked as an interactive login shell, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.

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

When an interactive shell that is not a login shell is started, Bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the --norc option. The --rcfile file option will force Bash to read and execute commands from file instead of ~/.bashrc.

  • Wikipedia

Solution 1:

In your login shell's profile files you can set up some things that you will use during your session, and which only need to be done once. Some ideas:

  • create a temporary file containing the IP address you connected from, later on you can include it in some scripts setting firewall rules.
  • run ssh-agent, ask for your SSH keys, and store the SSH agent environment variables in a file.
  • if that is a limited machine, and your co-workers want to be aware of each others logins, write(1) messages informing them of your login.

In a non-login shell's files (.bashrc) you should configure your shell:

  • Fancy prompt
  • set aliases
  • set history options
  • define custom shell functions
  • export environment variables, (maybe PAGER, EDITOR if system-wide settings suck)
  • load ssh-agent variables saved in .bash_profile

Usually, you would include .bashrc from .bash_profile with the following. Then login shell gets all your customizations, and .bash_profile file does not have to duplicate things that are already in .bashrc.

[[ -f ~/.bashrc ]] && . ~/.bashrc