As far as I know the interactive shells may be login or not login and the start up files for them are different. If interactive + login shell  /etc/profile then the first readable of ~/.bash_profile, ~/.bash_login, and ~/.profile If interactive + non-login shell  /etc/bash.bashrc then ~/.bashrcI want to set some variables everytime I use an interactive shell regardless if it is a login shell or not.
Is there a Bash file that will be always sourced in interactive mode no matter if it is login or non-login?
bash;bashrc
No, there isn't. Yes, this is a design defect.Use the following content in ~/.bash_profile:if [ -e ~/.profile ]; then . ~/.profile; fiif [[ -e ~/.bashrc && $- = *i* ]]; then . ~/.bashrc; fiBeware that bash has an even weirder quirk: when it is a non-interactive login shell and the parent process is rshd or sshd, bash sources ~/.bashrc (but not ~/.bash_profile or ~/.profile). So you might want to put this at the top of your .bashrc:if [[ $- != *i* ]]; then return; fiSee also Difference between .bashrc and .bash_profile and Difference between Login Shell and Non-Login Shell?