Free Hosting Online for WorkStations

< Previous | Contents | Next >

When a login shell exits, bash reads and executes commands from the file ~/.bash_logout, if it exists. This procedure is explained in detail in the login and bash man pages.

7.2.3. A typical set of setup files


7.2.3.1. /etc/profile example


Let's look at some of these config files. First /etc/profile is read, in which important variables such as

PATH, USER and HOSTNAME are set:


debby:~> cat /etc/profile

# /etc/profile


# System wide environment and startup programs, for login setup

# Functions and aliases go in /etc/bashrc


# Path manipulation

if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/sbin" ; then PATH=/sbin:$PATH

fi


if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/usr/sbin" ; then PATH=/usr/sbin:$PATH

fi


if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/usr/local/sbin" then

PATH=/usr/local/sbin:$PATH

fi


if ! echo $PATH | /bin/grep -q "/usr/X11R6/bin" ; then PATH="$PATH:/usr/X11R6/bin"

fi

debby:~> cat /etc/profile

# /etc/profile


# System wide environment and startup programs, for login setup

# Functions and aliases go in /etc/bashrc


# Path manipulation

if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/sbin" ; then PATH=/sbin:$PATH

fi


if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/usr/sbin" ; then PATH=/usr/sbin:$PATH

fi


if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/usr/local/sbin" then

PATH=/usr/local/sbin:$PATH

fi


if ! echo $PATH | /bin/grep -q "/usr/X11R6/bin" ; then PATH="$PATH:/usr/X11R6/bin"

fi

These lines check the path to set: if root opens a shell (user ID 0), it is checked that /sbin, /usr/sbin and

/usr/local/sbin are in the path. If not, they are added. It is checked for everyone that

/usr/X11R6/bin is in the path.


# No core files by default ulimit -S -c 0 > /dev/null 2>&1

# No core files by default ulimit -S -c 0 > /dev/null 2>&1

All trash goes to /dev/null if the user doesn't change this setting.


USER=`id -un` LOGNAME=$USER

MAIL="/var/spool/mail/$USER"


HOSTNAME=`/bin/hostname` HISTSIZE=1000

USER=`id -un` LOGNAME=$USER

MAIL="/var/spool/mail/$USER"


HOSTNAME=`/bin/hostname` HISTSIZE=1000

Here general variables are assigned their proper values.


if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then INPUTRC=/etc/inputrc

fi

if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then INPUTRC=/etc/inputrc

fi

If the variable INPUTRC is not set, and there is no .inputrc in the user's home directory, then the default input control file is loaded.



export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

All variables are exported, so that they are available to other programs requesting information about your environment.


7.2.3.2. The profile.d directory


for i in /etc/profile.d/*.sh ; do if [ -r $i ]; then

. $i

fi done unset i

for i in /etc/profile.d/*.sh ; do if [ -r $i ]; then

. $i

fi done unset i

All readable shell scripts from the /etc/profile.d directory are read and executed. These do things like enabling color-ls, aliasing vi to vim, setting locales etc. The temporary variable i is unset to prevent it from disturbing shell behavior later on.


7.2.3.3. .bash_profile example


Then bash looks for a .bash_profile in the user's home directory:


debby:~> cat .bash_profile

#################################################################

# #

# .bash_profile file #

# #

# Executed from the bash shell when you log in. #

# #

#################################################################


source ~/.bashrc source ~/.bash_login

This very straight forward file instructs your shell to first read ~/.bashrc and then ~/.bash_login. You will encounter the source built-in shell command regularly when working in a shell environment: it is used to apply configuration changes to the current environment.


7.2.3.4. .bash_login example


The ~/.bash_login file defines default file protection by setting the umask value, see Section 3.4.2.2. The ~/.bashrc file is used to define a bunch of user-specific aliases and functions and personal environment variables. It first reads /etc/bashrc, which describes the default prompt (PS1) and the default umask value. After that, you can add your own settings. If no ~/.bashrc exists, /etc/bashrc is read by default.


7.2.3.5. /etc/bashrc example


Your /etc/bashrc file might look like this:


debby:~> cat /etc/bashrc

# /etc/bashrc


# System wide functions and aliases

# Environment stuff goes in /etc/profile


# by default, we want this to get set.

debby:~> cat /etc/bashrc

# /etc/bashrc


# System wide functions and aliases

# Environment stuff goes in /etc/profile


# by default, we want this to get set.


# Even for non-interactive, non-login shells.

if [ `id -gn` = `id -un` -a `id -u` -gt 99 ]; then umask 002

else

umask 022

fi

# Even for non-interactive, non-login shells.

if [ `id -gn` = `id -un` -a `id -u` -gt 99 ]; then umask 002

else

umask 022

fi

These lines set the umask value. Then, depending on the type of shell, the prompt is set:


# are we an interactive shell? if [ "$PS1" ]; then

if [ -x /usr/bin/tput ]; then

if [ "x`tput kbs`" != "x" ]; then

# We can't do this with "dumb" terminal stty erase `tput kbs`

elif [ -x /usr/bin/wc ]; then

if [ "`tput kbs|wc -c `" -gt 0 ]; then

# We can't do this with "dumb" terminal stty erase `tput kbs`

fi fi

fi

case $TERM in

xterm*)

if [ -e /etc/sysconfig/bash-prompt-xterm ]; then PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm

else

PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:

${PWD/$HOME/~}\007"'

fi

;;

*)

[ -e /etc/sysconfig/bash-prompt-default ] && PROMPT_COMMAND=

/etc/sysconfig/bash-prompt-default

;;

esac

[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "


if [ "x$SHLVL" != "x1" ]; then # We're not a login shell for i in /etc/profile.d/*.sh; do

if [ -x $i ]; then

. $i

fi

done

fi

fi

# are we an interactive shell? if [ "$PS1" ]; then

if [ -x /usr/bin/tput ]; then

if [ "x`tput kbs`" != "x" ]; then

# We can't do this with "dumb" terminal stty erase `tput kbs`

elif [ -x /usr/bin/wc ]; then

if [ "`tput kbs|wc -c `" -gt 0 ]; then

# We can't do this with "dumb" terminal stty erase `tput kbs`

fi fi

fi

case $TERM in

xterm*)

if [ -e /etc/sysconfig/bash-prompt-xterm ]; then PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm

else

PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:

${PWD/$HOME/~}\007"'

fi

;;

*)

[ -e /etc/sysconfig/bash-prompt-default ] && PROMPT_COMMAND=

/etc/sysconfig/bash-prompt-default

;;

esac

[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "


if [ "x$SHLVL" != "x1" ]; then # We're not a login shell for i in /etc/profile.d/*.sh; do

if [ -x $i ]; then

. $i

fi

done

fi

fi



7.2.3.6. .bash_logout example


Upon logout, the commands in ~/.bash_logout are executed, which can for instance clear the terminal, so that you have a clean window upon logging out of a remote session, or upon leaving the system console:


debby:~> cat .bash_logout

# ~/.bash_logout


clear

debby:~> cat .bash_logout

# ~/.bash_logout


clear

Let's take a closer look at how these scripts work in the next section. Keep info bash close at hand.



Top OS Cloud Computing at OnWorks: