Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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

share|improve this question
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
up vote 3 down vote accepted

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
share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .