3.1. Shell 初始化文件

3.1.1. 系统范围的配置文件

3.1.1.1. /etc/profile

当使用--login选项以交互方式调用,或者作为 sh 调用时,Bash 会读取/etc/profile的指令。这些指令通常设置 shell 变量PATH, USER, MAIL, HOSTNAMEHISTSIZE.

在某些系统中,umask 值在/etc/profile中配置;在其他系统中,此文件包含指向其他配置文件的指针,例如

  • /etc/inputrc,系统范围的 Readline 初始化文件,您可以在其中配置命令行响铃样式。

  • 还有/etc/profile.d目录,其中包含配置特定程序的系统范围行为的文件。

您希望应用于所有用户环境的所有设置都应在此文件中。它可能看起来像这样

# /etc/profile

# System wide environment and startup programs, for login setup

PATH=$PATH:/usr/X11R6/bin

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

USER="`id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"

HOSTNAME=`/bin/hostname`
HISTSIZE=1000

# Keyboard, bell, display style: the readline config file:
if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
    INPUTRC=/etc/inputrc
fi

PS1="\u@\h \W"

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC PS1

# Source initialization files for specific programs (ls, vim, less, ...)
for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        . $i
    fi
done

# Settings for program initialization
source /etc/java.conf
export NPX_PLUGIN_PATH="$JRE_HOME/plugin/ns4plugin/:/usr/lib/netscape/plugins"

PAGER="/usr/bin/less"

unset i

此配置文件设置了一些基本的 shell 环境变量,以及运行 Java 和/或 Java 应用程序在 Web 浏览器中所需的一些变量。请参阅 第 3.2 节

有关此文件中使用的条件 if 的更多信息,请参阅 第 7 章第 9 章 讨论了诸如 for 构造的循环。

Bash 源码包含示例profile文件,用于通用或个人使用。这些文件和上面示例中的文件都需要进行更改,以便它们在您的环境中工作!

3.1.1.2. /etc/bashrc

在提供多种 shell 类型的系统上,最好将特定于 Bash 的配置放在此文件中,因为/etc/profile也会被其他 shell(例如 Bourne shell)读取。通过拆分不同类型 shell 的配置文件,可以防止不理解 Bash 语法的 shell 生成错误。在这种情况下,用户的~/.bashrc可能会指向/etc/bashrc以便将其包含在登录时的 shell 初始化过程中。

您可能还会发现/etc/profile在您的系统上仅保存 shell 环境和程序启动设置,而/etc/bashrc包含 shell 函数和别名的系统范围定义。

/etc/bashrc文件可能会在/etc/profile或在单个用户 shell 初始化文件中被引用。

该源码包含示例bashrc文件,或者您可以在/usr/share/doc/bash-2.05b/startup-files中找到副本。这是bashrcBash 文档附带的

alias ll='ls -l'
alias dir='ls -ba'
alias c='clear'
alias ls='ls --color'

alias mroe='more'
alias pdw='pwd'
alias sl='ls --color'

pskill()
{
        local pid

        pid=$(ps -ax | grep $1 | grep -v grep | gawk '{ print $1 }')
        echo -n "killing $1 (process $pid)..."
        kill -9 $pid
        echo "slaughtered."
}

的一部分。 除了通用别名外,它还包含有用的别名,即使您拼写错误,也可以使命令正常工作。 我们将在 第 3.5.2 节中讨论别名。 此文件包含一个函数 pskill; 函数将在 第 11 章中详细研究。

3.1.2. 单个用户配置文件

Note我没有这些文件?!
 

默认情况下,这些文件可能不在您的主目录中;如果需要,请创建它们。

3.1.2.1. ~/.bash_profile

这是单独配置用户环境的首选配置文件。在此文件中,用户可以添加额外的配置选项或更改默认设置

franky~> cat .bash_profile
#################################################################
#                                                               #
#   .bash_profile file                                          #
#                                                               #
#   Executed from the bash shell when you log in.               #
#                                                               #
#################################################################

source ~/.bashrc
source ~/.bash_login
case "$OS" in
  IRIX)
    stty sane dec
    stty erase
    ;;
#  SunOS)
#    stty erase
#    ;;
  *)
    stty sane
    ;;
esac

此用户配置了不同操作系统上登录的退格字符。除此之外,用户的.bashrc.bash_login也会被读取。

3.1.2.2. ~/.bash_login

此文件包含特定设置,这些设置通常仅在您登录系统时执行。 在此示例中,我们使用它来配置 umask 值并在登录时显示已连接用户的列表。此用户还会获取当前月份的日历

#######################################################################
#                                                                     #
#   Bash_login file                                                   #
#                                                                     #
#   commands to perform from the bash shell at login time             #
#   (sourced from .bash_profile)                                      #
#                                                                     #
#######################################################################
#   file protection
umask 002       # all to me, read to group and others
#   miscellaneous
w
cal `date +"%m"` `date +"%Y"`

如果没有~/.bash_profile,则会读取此文件。

3.1.2.3. ~/.profile

如果没有~/.bash_profile~/.bash_login, ~/.profile将会被读取。它可以包含相同的配置,然后也可以通过其他 shell 访问这些配置。请注意,其他 shell 可能不理解 Bash 语法。

3.1.2.4. ~/.bashrc

如今,使用非登录 shell 更为常见,例如,在使用 X 终端窗口以图形方式登录时。打开这样的窗口时,用户不必提供用户名或密码; 不进行身份验证。当发生这种情况时,Bash 会搜索~/.bashrc,因此它也在登录时读取的文件中被引用,这意味着您不必在多个文件中输入相同的设置。

在这个用户的.bashrc中,定义了几个别名,并且在系统范围的/etc/bashrc被读取之后,设置了特定程序的变量。

franky ~> cat .bashrc
# /home/franky/.bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
       . /etc/bashrc

fi

# shell options

set -o noclobber

# my shell variables

export PS1="\[\033[1;44m\]\u \w\[\033[0m\] "
export PATH="$PATH:~/bin:~/scripts"

# my aliases

alias cdrecord='cdrecord -dev 0,0,0 -speed=8'
alias ss='ssh octarine'
alias ll='ls -la'

# mozilla fix

MOZILLA_FIVE_HOME=/usr/lib/mozilla
LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins
MOZ_DIST_BIN=/usr/lib/mozilla
MOZ_PROGRAM=/usr/lib/mozilla/mozilla-bin
export MOZILLA_FIVE_HOME LD_LIBRARY_PATH MOZ_DIST_BIN MOZ_PROGRAM

# font fix
alias xt='xterm -bg black -fg white &'

# BitchX settings
export IRCNAME="frnk"

# THE END
franky ~>

更多示例可以在 Bash 包中找到。 请记住,示例文件可能需要进行更改才能在您的环境中工作。

别名在 第 3.5 节中讨论。

3.1.2.5. ~/.bash_logout

此文件包含注销过程的特定说明。在此示例中,注销时会清除终端窗口。这对于远程连接非常有用,远程连接在关闭后会留下一个干净的窗口。

franky ~> cat .bash_logout
#######################################################################
#                                                                     #
#   Bash_logout file                                                  #
#                                                                     #
#   commands to perform from the bash shell at logout time            #
#                                                                     #
#######################################################################
clear
franky ~>

3.1.3. 更改 shell 配置文件

在对上述任何文件进行更改时,用户必须重新连接到系统,或者 source 更改后的文件才能使更改生效。通过以这种方式解释脚本,更改将应用于当前的 shell 会话。

图 3-1. 不同用户的不同提示符

大多数 shell 脚本都在私有环境中执行:变量不会被子进程继承,除非它们由父 shell 导出。 sourcing 包含 shell 命令的文件是一种将更改应用于您自己的环境并在当前 shell 中设置变量的方式。

此示例还演示了不同用户使用不同提示符设置的情况。在这种情况下,红色表示危险。当您有一个绿色提示符时,不要太担心。

请注意, source resourcefile. resourcefile 相同。

如果您在所有这些配置文件中迷失,并发现自己面对 origin 不明确的设置,请使用 echo 语句,就像调试脚本一样;请参阅 第 2.3.2 节。您可以添加这样的行

echo "Now executing .bash_profile.."

或像这样

echo "Now setting PS1 in .bashrc:"
export PS1="[some value]"
echo "PS1 is now set to $PS1"