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