Bash Concepts: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
No edit summary
Line 24: Line 24:
=bash Startup Files=
=bash Startup Files=


When bash is invoked as an interactive login shell, or as a non-interactive shell with the <tt>--login</tt> option, it first executes commands from <tt>/etc/profile</tt>, if exists.  
When bash is invoked as an ''interactive'' login shell, or as a ''non-interactive shell with the <tt>--login</tt> option'', it first executes commands from <tt>/etc/profile</tt>, if exists.  


Them it looks for <tt>~/.bash_profile</tt>, <tt>~/.bash_login</tt> and <tt>~/.profile</tt> in that order. It executes commands from the first one that exists and is readable. The <tt>--noprofile</tt> option may be used when the shell is started to inhibit this behavior.
Them it looks for <tt>~/.bash_profile</tt>, <tt>~/.bash_login</tt> and <tt>~/.profile</tt> in that order. It executes commands from the first one that exists and is readable. The <tt>--noprofile</tt> option may be used when the shell is started to inhibit this behavior.
Line 30: Line 30:
When a login shell exits, bash executes commands from <tt>~/.bash_logout<tt>, if it exists.
When a login shell exits, bash executes commands from <tt>~/.bash_logout<tt>, if it exists.


When an interactive shell that is not a login shell is started, bash executes commands from <tt>~/.bashrc</tt>, if it exists. This may be inhibited by using the <tt>--norc</tt> option. The <tt>--rcfile</tt> file option will force bash to execute commands from the specified file instead of <tt>~/.bashrc</tt>.
When an ''interactive'' shell that is not a login shell is started, bash executes commands from <tt>~/.bashrc</tt>, if it exists. This may be inhibited by using the <tt>--norc</tt> option. The <tt>--rcfile</tt> file option will force bash to execute commands from the specified file instead of <tt>~/.bashrc</tt>.


When bash is started in non-interactive mode, to run a shell script, for example, it looks for the variable <tt>BASH_ENV</tt> in the  environment, expands  its value if it appears there, and uses the expanded value as the name of a file execute. Bash behaves  as if the following command were executed:
When bash is started in ''non-interactive mode'', to run a shell script, for example, it looks for the variable <tt>BASH_ENV</tt> in the  environment, expands  its value if it appears there, and uses the expanded value as the name of a file execute. Bash behaves  as if the following command were executed:
<pre>
<pre>
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

Revision as of 00:40, 23 February 2016

Internal

Login Shell

A login shell is a shell whose first character of its argument zero is a -, or it was started with the --login option.

Interactive Shell

An interactive shell is a shell started:

  • without the -c option
  • without non-option arguments
  • with the -i option

The interactive shell's standard input and error are both connected to terminals.

$- includes i if the shell is interactive, allowing a script or a startup file to test this state.

Non-interactive Shell

A shell started with -c option.

bash Startup Files

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first executes commands from /etc/profile, if exists.

Them it looks for ~/.bash_profile, ~/.bash_login and ~/.profile in that order. It executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.

When a login shell exits, bash executes commands from ~/.bash_logout, if it exists.

When an interactive shell that is not a login shell is started, bash executes commands from ~/.bashrc, if it exists. This may be inhibited by using the --norc option. The --rcfile file option will force bash to execute commands from the specified file instead of ~/.bashrc.

When bash is started in non-interactive mode, 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 execute. Bash behaves as if the following command were executed:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

but the value of the PATH variable is not used to search for the file name.

If any of the files exist but cannot be read, bash reports an error.