Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

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
add comment

1 Answer

up vote 2 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
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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