142

What is the difference between ~/.profile and ~/.bash_profile?

2

4 Answers 4

98

The .profile was the original profile configuration for the Bourne shell (a.k.a., sh). bash, being a Bourne compatible shell will read and use it. The .bash_profile on the other hand is only read by bash. It is intended for commands that are incompatible with the standard Bourne shell.

5
  • 1
    If i am wrong, do correct me.. .profile is used by any Bourne compatible shell whereas .bash_profile is used by bash only.. am i right?
    – lakshmen
    Commented Aug 17, 2012 at 5:08
  • 6
    @lakesh: Yes, any shell providing bourne compatibility will read .profile. E.g., bash and ksh but not csh or tcsh. And zsh provides both sh and csh compatibility so it will read both .profile and .login, as well as zsh specific dot files.
    – bahamat
    Commented Aug 17, 2012 at 7:59
  • is there any tutorial to read up on this bash and ksh stuff? never heard of these before...
    – lakshmen
    Commented Aug 17, 2012 at 8:02
  • 5
    You could start with the UNIX Shell History.
    – bahamat
    Commented Aug 17, 2012 at 16:12
  • 1
    @bahamat in my testing, and according to this gnu doc, ~/.profile is only read by sh if /etc/profile does not exist (note my sh is invoking bash). Commented Mar 15, 2021 at 23:47
60

The original sh sourced .profile on startup.

bash will try to source .bash_profile first, but if that doesn't exist, it will source .profile1.

Note that if bash is started as sh (e.g. /bin/sh is a link to /bin/bash) or is started with the --posix flag, it tries to emulate sh, and only reads .profile.

Footnotes:

  1. Actually, the first one of .bash_profile, .bash_login, .profile

See also:

3
  • A small point about bash started as sh: ~/.profile will only be read if /etc/profile does not exist. This gnu doc explains it all in agonizing detail. Commented Mar 15, 2021 at 23:43
  • so if .bash_profile exists, .profile is not read?
    – a06e
    Commented Oct 23, 2022 at 8:41
  • @a06e Correct (unless .bash_profile does something like source .profile).
    – ikegami
    Commented Feb 23 at 15:46
24

You know many shells exist in the UNIX world, but most of them are:

  • Bourne shell: /bin/sh (Inventor: Stephen Bourne)
  • BASH (Bourne Again Shell): /bin/bash (Inventor: Brian Fox, under GNU project) (powerful shell)
  • C shell: /bin/csh (Inventor: Bill Joy, Inventor of TCP/IP Stack)
  • Korn shell: /bin/ksh (Inventor: David Korn under Bell Labs)
  • Z shell: /bin/zsh (Powerful shell)
  • TENEX C shell: /bin/tcsh (derived from C Shell)
  • Debian Almquist shell: /bin/dash (Derived from Almquist shell (ash under NetBSD project)) (Dash born from lenny)

But your question is about ~/.bash_profile and ~/.profile:

When you you log in to a UNIX machine, it redirects to your home directory, according to the shell chosen by an administrator in the last field of /etc/passwd such as :

mohsen:x:1000:1000:Mohsen Pahlevanzadeh,,,:/home/mohsen:/bin/bash

Your shell runs, and by default each shell has a set file for login and logout. When you log in on bash, ~/.profile is run and when you logout, ~/.bash_logout is run. ~/.bash_history file keeps your input command.

Initialization file in each shell

TENEX C shell

  • ~/.login When you login
  • ~/.logout When you logout
  • ~/.tcshrc same as ~./bashrc in bash

You can set variable $histfile as name of history file and variable $history as number of commands to keeping.

Z shell

Indeed it's powerful shell and if you get free time, be sure migrate to it.

Except of other shell, Z shell has many configuration file and initialization files, just i write:

$ZDOTDIR/.zshenv
$ZDOTDIR/.zprofile
$ZDOTDIR/.zshrc
$ZDOTDIR/.zlogin
$ZDOTDIR/.zlogout
/tmp/zsh*
/etc/zshenv
/etc/zprofile
/etc/zshrc
/etc/zlogin

Note: if $ZDOTDIR unset, home set.

C shell

Note: TENEX C shell was forked from C shell. C shell supports by BSD. If you are familiar with C language programing, you should be comfortable since its syntax is similar.

~/.login
~/.cshrc
~/.logout

Note: csh is old. Use tcsh instead.

Korn Shell

  • ~/.profile
  • rc file: user defined
  • logout file: N/A

Bourne Again SHell (BASH)

It's very very powerful shell and born under GNU project and forked by Bourne Shell.

~/.bash_login
~/.bash_logout
~/.bashrc
~/.bash_profile
~/.bash_history

When you login, bash runs ~/.bash_profile and ~/.bash_profile runs ~/.bashrc. Indeed ~/.bashrc isn't bash initialization file, because bash doesn't run it.

Bourne shell

It dead. Even when you use man sh, you see manual of dash. [Editor's note: the bit about dash only applies to Debian and Debian-based distros like Ubuntu.]

Your Answer

~/.bash_profile work under bash, but ~/.profile work under Bourne and Korn shell.

1
  • 2
    Chet Ramey was the main developer for Bash.
    – tripleee
    Commented Jan 31, 2013 at 10:19
6

A login shell is simply a shell you can login as via it ssh or at the console. A non-login shell is a shell that someone can not login too. A non-login shell is often used by programs/system services.

As for your third point. It is true .bashrc is executed on each instance of the shell. However .bash_profile is only used upon login. Thus the reason for the two separate files.

.profile is for things that are not specifically related to Bash, like environment variables $PATH it should also be available anytime. .bash_profile is specifically for login shells or shells executed at login.

4
  • difference between ~/.profile and ~/.bash_profile?
    – lakshmen
    Commented Aug 17, 2012 at 4:46
  • 2
    .profile is for things that are not specifically related to Bash, like environment variables PATH it should also be available anytime. .bash_profile is specifically for login shells or shells executed at login.
    – anzenketh
    Commented Aug 17, 2012 at 4:54
  • add that statement to your answer.... cos that what's my question is....
    – lakshmen
    Commented Aug 17, 2012 at 4:57
  • Huh? That doesn't even answer the question?
    – Mikel
    Commented Aug 17, 2012 at 15:32

You must log in to answer this question.

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