134

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

Diogo Gomes
  • 125
  • 7
lakshmen
  • 6,071
  • 5
  • 17
  • 9

4 Answers4

92

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.

bahamat
  • 38,658
  • 4
  • 70
  • 103
  • 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 Aug 17 '12 at 05:08
  • 5
    @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 Aug 17 '12 at 07:59
  • is there any tutorial to read up on this bash and ksh stuff? never heard of these before... – lakshmen Aug 17 '12 at 08:02
  • 5
    You could start with the [UNIX Shell History](http://www.softpanorama.org/People/Shell_giants/introduction.shtml). – bahamat Aug 17 '12 at 16:12
  • 1
    @bahamat in my testing, and according to [this gnu doc](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html), `~/.profile` is only read by `sh` if `/etc/profile` does not exist (note my `sh` is invoking `bash`). – SpinUp __ A Davis Mar 15 '21 at 23:47
56

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:

Mikel
  • 56,387
  • 13
  • 130
  • 149
21

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.

wjandrea
  • 658
  • 7
  • 19
PersianGulf
  • 10,728
  • 8
  • 51
  • 78
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.

jasonwryan
  • 71,734
  • 34
  • 193
  • 226
anzenketh
  • 111
  • 8