.bashrc/.profile is not loaded on new tmux session (or window) -- why?
When tmux starts or opens a new window, it does not load my .profile
or .bashrc
. I end up typing . ~/.bashrc
every time. Is there a way to make this happen automatically?
Solution 1:
Yes, at the end of your .bash_profile
, put the line:
. ~/.bashrc
This automatically sources the rc file under those circumstances where it would normally only process the profile.
The rules as to when bash
runs certain files are complicated, and depend on the type of shell being started (login/non-login, interactive or not, and so forth), along with command line arguments and environment variables.
You can see them in the man bash
output, just look for INVOCATION
- you'll probably need some time to digest and decode it though :-)
Solution 2:
Running bash explicitly worked for me, by adding this line to my ~/.tmux.conf file:
set-option -g default-command "exec /bin/bash"
Solution 3:
Former answers provided solutions but didn't explain the reason. Here it is.
This is related to the Bash init files. By default, ~/.bashrc
is used in an interactive, non-login shell. It won't be sourced in a login shell. Tmux uses a login shell by default. Hence, shells started by tmux skip ~/.bashrc
.
default-command
shell-commandThe default is an empty string, which instructs tmux to create a login shell using the value of the
default-shell
option.
Init files for Bash,
- login mode:
/etc/profile
-
~/.bash_profile
,~/.bash_login
,~/.profile
(only first one that exists)
-
interactive non-login:
-
/etc/bash.bashrc
(some Linux; not on Mac OS X) ~/.bashrc
-
- non-interactive:
- source file in
$BASH_ENV
- source file in
The weird interactive, non-login loading requirement confuses people in other situations as well. The best solution is to change the loading requirement of ~/.bashrc
as interactive only, which is exactly what some distros, like Ubuntu, are doing.
# write content below into ~/.profile, or ~/.bash_profile
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
This should be the solution you desire. And I recommend every Bash user setup this in the profile.
References
- Unix Shell Initialization
man tmux
Solution 4:
From this thread:
- https://bbs.archlinux.org/viewtopic.php?id=124274
seems using .bash_profile
would work.