配置 Bash

作者:David Blackman

欢迎来到 Bash 的世界,它是 Linux 中使用最广泛的 shell。Bash 的可配置性令人惊讶,当您读完本文时,您将拥有一个更舒适的环境。Bash 不区分内部 shell 变量和外部环境变量。shell 变量是一个变量(通常全部大写),与一个值相关联,并在 shell 之间传递。许多程序使用它们自己的变量,例如 PILOTRATE,它们会检查这些变量。Bash 有它自己的变量,例如 MAIL,这对它很重要。环境变量使用以下语法设置

export VAR=VALUE
或分两行
VAR=VALUE
export VAR
要检查环境变量的值,输入 echo $VAR,或者要查看所有已设置的变量,输入 env。bash 为登录 shell(在控制台上)执行您的 ~/.bash_profile 文件,为非登录 shell(xterms 等)执行 ~/.bashrc 文件。通常您可能只想将一个链接到另一个。如果您在命令行上导出变量或设置别名,它只在该 bash 会话中保持活动状态。您必须将其放在您的登录脚本中才能使其生效。如果您开始拥有一个庞大的 .bashrc 文件并想要更好的组织,您可以将其拆分。通常,人们将他们的 .bashrc 分成别名、变量和函数,而 .bashrc 只是执行其他的。要让您的 .bashrc 执行其他文件,请放入类似这样的行
source FILE
提示符

我们将讨论的第一个环境变量是 PS1。PS1 存储一个字符串,该字符串由 bash 解释以用作您的提示符。这是一个 PS1 示例及其生成的提示符

PS1='<\u@\h:\w>$'
<blackmad@moomintroll:/etc>

反斜杠字符会被解释,而其他字符则按原样显示。\u 被转换为用户名,\h 被转换为主机名(直到第一个句点),\w 是工作目录。一些最重要的反斜杠字符(也可以在 bash 手册页的 PS1 部分找到)显示在表“解释字符”中。

表 1. 解释字符

酷炫的 Xterm 标题

所有 X 终端模拟器(xterm、rxvt、Eterm 等)中最酷的事情之一是,如果您打印 "\033]0;STRING_HERE\007",终端的标题将更改为 STRING_HERE。尝试通过输入以下内容来执行此操作

echo -n "\033]0;Be Happy\007"

我对此的操作是在我的 .bashrc 函数 xtitle 中放入一个小函数(见列表 1),并且我在设置我的 PS1 变量后调用它,所以在我的 .bashrc 文件的末尾我有这样一行

PS1=''\u@\h:\w>$''
xtitle
export PS1
这意味着如果我在终端模拟器中,它将设置 TITLEBAR,这是一个字符串,它会将 user@hostname:directory 附加到我的提示符字符串(以便每次我获得新提示符时都会打印),然后导出它。(请注意,如果您的终端模拟器将 $TERM 设置为 xterm* 或 rxvt* 以外的其他内容,您需要在括号前添加另一个 case,带有 | WEIRD_TERM_ENVxterm* | rxvt* 行上。)

列表 1. 函数 xtitle

别名

与 Bash 一起使用最有用的东西之一是别名。别名只是指示 Bash 将文本字符串解释为其他内容。例如,您可以修复它,以便当您键入 happy 时,Bash 会将其解释为

echo I'm a shiny happy shell

所有别名都采用相同的形式

alias ALIAS="COMMAND"
通常,您可能想要更改命令的默认行为,例如 ls。我以这种方式为 ls 设置别名
alias ls="ls -aF --color"
ls 现在以彩色方式打印所有文件,并进行分类。\ls 将执行未设置别名的命令。其他时候,您可能会决定定义一个全新的命令,以缩短重复输入的次数。以下是我使用的一些别名
alias mkall=\
        "./configure && make && sudo make install"
alias whizz="ssh whizziwig@www.whizziwig.com"
alias tgz="tar -xvzf" alias ll="ls -aFl"
alias ls-d="ls -Sc"
这些都节省了时间和击键次数,并且由于您在别名后键入的任何内容仍然会传递给 Bash,因此它只会转换别名的部分。在我的情况下,执行 tgz linux-2.2.14.tar.gz 实际上执行的是 tar -xvzf linux-2.2.14.tar.gz
邮件

$MAIL 变量指定您希望 Bash 轮询新邮件的邮箱。您通常希望将其设置为您的收件箱。我使用 procmail,所以我有很多邮件文件夹。我的收件箱(实际发送给我的邮件发送到的位置)是 /home/blackmad/Mail/inbox,所以当我在那里收到新电子邮件时,Bash 会告诉我:“您在 /home/blackmad/Mail/inbox 中有邮件。”

路径

PATH 变量确定 Bash 在何处以及以何种顺序查找可执行文件。每个目录用冒号 (:) 分隔。Bash 从右到左解释您的路径。假设您的 PATH 设置为 /usr/bin:/bin/:/sbin/:/sbin/。当您输入命令时,Bash 将首先在其内部 shell 函数中查找它,然后是 /usr/bin,然后是 /bin,依此类推,直到它找到命令或到达 PATH 的末尾。通常,您可能只想附加或前缀您当前的 PATH;您可以通过指定以下内容来执行此操作

PATH="$PATH:/next/path:/next_next/path"

PATH="/prev/path:$PATH:/next/path"
export PATH
在第一个示例中,Bash 将在完成当前 PATH 后查找 /next/path/next_next/path。在第二个示例中,Bash 将首先在 /prev/path 中查找。您可能想要将 /usr/local/bin 作为 PATH 的前缀,因为这是手动编译的程序通常所在的位置,并且这些程序通常比您的发行版附带的程序更新。您可能还想将 ~/bin 作为前缀,并在您的主目录中拥有一个 bin 目录,您可以在其中放置程序的自定义版本和脚本(如果您没有该框的 root 权限,这将非常有用)。
最后一步

由于 Bash 只是遍历您的 .bashrc 文件并执行其中的所有内容,因此您可以放入您希望在每次登录时运行的程序。在我的 .bashrc 文件的末尾,我有以下内容

fortune
mesg y
users

因此,每当我登录时,fortune 都会用一些智慧格言问候我,消息被打开,并且我发现谁登录了系统。

Configuring Bash
David Blackman 是 Stuyvesant 高中的一名大二学生和系统管理员。他希望尽快为 Linux 编写杀手级应用程序,并被 VA Linux Systems 聘用。他热爱 Perl,即使他知道它是邪恶的,并且喜欢 C 的指针运算。
加载 Disqus 评论