Where is .bash_profile?

It's a hidden file, located in your home folder:

~/.bash_profile

(the ~ expands to your home directory. If your username is user, the result would be: /home/user/.bash_profile).

Since it's an hidden file, you have to make it visible. To do it in Nautilus go to the "View" menu and check "Show hidden files" (or press the shortcut Ctrl + H).

If you are using Kubuntu with Dolphin, you have to press Ctrl + . to toggle the visibility of files.


~/.bash_profile is not the right place to put aliases and functions. They should go in ~/.bashrc. See http://mywiki.wooledge.org/DotFiles for an explanation.


You do not usually have .bash_profile on Ubuntu, nor should you usually create that file. As jpezz says, it would be in your home directory on your Ubuntu system, which is what ~ stands for, and you can create it there. But if you do, you should be careful, because it will prevent bash from automatically running the commands in .profile--which you almost certainly do have.

When bash runs as a login shell, in WSL or otherwise1, it runs the first of .bash_profile, .bash_login, or .profile that exists in your home directory. If you have bash-specific commands that you want to run when you log in--but only when bash is your shell--you could put them in .bash_profile. But the mere existence of .bash_profile would prevent .profile from being used.

So then you would want to source .profile from .bash_profile, assuming you wanted those commands to be run too, which you almost always would. You could do that by putting this command in .bash_profile:

. ~/.profile

(Some readers may be accustomed to seeing that written as . "$HOME/.profile" when it appears in a startup script. That's always fine--and you may prefer to use that for commands that need to work on shells other than bash too, if you need to accommodate extremely old shells that don't support standard features, which--well, you don't need that. In any case, bash always supports tilde expansion and the point of .bash_profile is that only bash runs commands from it, so . ~/.profile is fine.)

The . builtin sources a file, which is to say it runs all the commands from the file in the current shell. Open an interactive bash shell and run help . for more information.

The reason you don't usually have .bash_profile on Ubuntu even if you have bash-specific commands that you want to run on login is that, by default, users' .profile files contain code that checks if the current shell is bash, then causes such commands to be run.

There is another answer to the question of where files like .profile or .bash_profile are. The default versions of these files exist in the /etc/skel directory. Files in that directory are copied into the Ubuntu home directories when user accounts are created on an Ubuntu system--including the user account you create as part of installing Ubuntu. If you look in that directory, you'll notice that there is a file called .profile--as well as some other files like .bashrc--but there is no file called .bash_profile. That is why--or, really, how--no .bash_profile exists in your Ubuntu home directory unless you have created it yourself.


Finally, you should not put aliases in .profile at all, nor is .bash_profile a good place for them, as geirha rightly says. This is because you will want your aliases to work in interactive shells whether or not they are login shells. Instead, define your aliases in .bashrc or, better, .bash_aliases (as guest boeroe points out), which the default .bashrc sources. See How do I create a permanent Bash alias?

The default .profile file will check if you are running a bash shell and source .bashrc if you are:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

Meanwhile the default .bashrc will quit at the top without doing anything if it runs in in a non-interactive shell, so commands in it won't run if it gets sourced by .profile in a non-interactive login shell and in other more obscure scenarios2:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

So if you put aliases in .bashrc or in .bash_aliases, you'll get them for interactive login shells (where .profile is used) as well as interactive non-login shells (where .bashrc is used). This is what you want. Just don't put anything above the interactivity check, unless you really, really know what you're doing.


1 This answer was originally written for a WSL-related question, but that question has been closed as a duplicate and this answer applies fully here as well, so I've expanded a bit and posted it here instead.

2 When bash detects that it is probably running as the initial shell of a remote login that is not a login shell--such as when you use ssh to run a single command on a remote machine--it runs commands from .bashrc. (See 6.2 Bash Startup Files in the GNU Bash manual.)

Tags:

Bash