What you describe is normal behavior. Starting bash with the -c
option will launch a 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 ~/.bashrc
, 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
-c
, in Linux GNU bash,-c
is the command you want to run.:
) so whatever I type in will become the command input to bash shell.