I have the following on my .vimrc

set shell=C:/cygwin/bin/bash
set shellcmdflag=-c
set shellxquote=\"

So the shell I am using is non-interactive and non-login. I thought that non-login shells source .bashrc, but that does not seem to be the case. I do not want to make my shell interactive or login. Is there a way for me source .bashrc in other way? My .bash_profile already sources .bashrc

  • Is there a reason you don't want an interactive shell? If you want to be able to launch commands and run things you will need an interactive shell. Also, are you sure about -c, in Linux GNU bash, -c is the command you want to run. – terdon Apr 21 '13 at 2:39
  • @terdon: interactive shell sets the current working directory to $HOME, which is not what I want. Yes, '-c` allows me to type the command in gvim command line (i.e. after :) so whatever I type in will become the command input to bash shell. – Forethinker Apr 21 '13 at 2:52

What you describe is normal behavior. Starting bash with the -c option will launch an non-interactive, non-login shell. This means that bash will not source any of its classic configuration files but the variable $BASH_ENV instead. As explained in the bash man page:

  • non-interactive, non-login shell:

    When bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it appears there, and uses the expanded value as the name of a file to read and execute. Bash behaves as if the following command were executed:

    if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
  • interactive, login shell:

    When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, 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.

  • interactive, non-login shell

    When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist. 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 /etc/bash.bashrc and ~/.bashrc.

So, if you want your non-interactive, non-login shell to source ~/.bahsrc, you will need to set the value of BASH_ENV to ~/.bashrc. Add this line to your ~/.bashrc or ~/.profile files:

export BASH_ENV=~/.bashrc
| improve this answer | |
  • 1
    If .bashrc is not being read, then how will adding export BASH_ENV=~/.bashrc to .bashrc help? – Hashken Aug 10 '16 at 6:27

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.