61

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.

Gareth
  • 8,733

1 Answers1

23

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
hayalci
  • 3,721