文章目录
- 什么存储在环境变量中?
- 检查环境变量
- 一些有趣的环境变量
- 如何建立 shell 环境?
- 一个启动文件的内容
- 修改 shell 环境
- 应该修改哪个文件?
- 文本编辑器
- 使用文本编辑器
- 激活修改
1. 什么存储在环境变量中?
shell 在环境中存储了两种基本类型的数据,虽然 bash 几乎无法分辨这些数据的类型。它们是
环境变量
和shell 变量
。Shell变量是 bash 存放的少量数据。剩下的都是环境变量。除了变量,shell 也存储了一些可编程的数据,即别名
和shell函数
2. 检查环境变量
用 bash 的内建命令
set
,或者是printenv
程序来查看环境变量。set
命令可以显示 shell 或环境变量,而printenv
只是显示环境变量。因为环境变量列表比较长,最好把每个命令的输出通过管道传递给 less 来阅读:
$ printenv | less
执行以上命令之后,应该能得到类似以下内容:
KDE_MULTIHEAD=false
SSH_AGENT_PID=6666
HOSTNAME=linuxbox
GPG_AGENT_INFO=/tmp/gpg-PdOt7g/S.gpg-agent:6689:1
SHELL=/bin/bash
TERM=xterm
XDG_MENU_PREFIX=kdeHISTSIZE=1000
XDG_SESSION_COOKIE=6d7b05c65846c3eaf3101b0046bd2b00-1208521990.996705
-1177056199
GTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/home/me/.gtkrc-2.0:/home/me/.kde/sh
are/config/gtkrc-2.0
GTK_RC_FILES=/etc/gtk/gtkrc:/home/me/.gtkrc:/home/me/.kde/share/confi
g/gtkrc
GS_LIB=/home/me/.fonts
WINDOWID=29360136
QTDIR=/usr/lib/qt-3.3
QTINC=/usr/lib/qt-3.3/include
KDE_FULL_SESSION=true
USER=me
LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01
:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:\*.cmd=00;32:\*.exe:
上面是环境变量及其数值的列表。例如,一个叫做
USER
的变量,这个变量值是 “me
”。printenv
命令也能够列出特定变量的数值:
$ printenv USER
me
当使用没有带选项和参数的
set
命令时,shell 变量,环境变量,和定义的 shell 函数
都会被显示。不同于printenv
命令,set
命令的输出很友好地按照首字母顺序排列:
$ set | less
也可以通过 echo 命令来查看一个变量的内容,像这样:
$ echo $HOME
/home/me
别名无法通过使用 set 或 printenv 来查看。用不带参数的 alias 来查看别名:
$ alias
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
3. 一些有趣的环境变量
shell 环境中包含相当多的变量。你可能会看到以下的环境变量:
变量 内容
DISPLAY 如果你正在运行图形界面环境,那么这个变量就是你显示器的名字。通常,它是”:0”,意思是由 X 产生的
第一个显示器
EDITOR 文本编辑器的名字
SHELL shell 程序的名字
HOME 用户家目录
LANG 定义了字符集以及语言编码方式
OLD_PWD 先前的工作目录
PAGER 页输出程序的名字。这经常设置为/usr/bin/less
PATH 由冒号分开的目录列表,当你输入可执行程序名后,会搜索这个目录列表
PS1 Prompt String 1. 这个定义了你的 shell 提示符的内容。这个变量内容可以全面地定制
PWD 当前工作目录
TERM 终端类型名。类 Unix 的系统支持许多终端协议;这个变量设置你的终端仿真器所用的协议
TZ 指定你所在的时区。大多数类 Unix 的系统按照协调时间时(UTC) 来维护计算机内部的时钟,然后应用一
个由这个变量指定的偏差来显示本地时间
USER 你的用户名
4. 如何建立 shell 环境?
当bash 程序启动,会读取一系列称为启动文件的配置脚本,这些文件定义了默认的可供所有用户共享的 shell环境。然后是读取更多位于自己家目录中的启动文件,这些启动文件定义了用户个人的 shell 环境。确切的启动顺序依赖于要运行的shell 会话类型。有两种 shell 会话类型:一个是登录 shell 会话,另一个是非登录 shell 会话。 登录 shell会话会在其中提示用户输入用户名和密码;例如,启动一个虚拟控制台会话。非登录 shell 会话通常在 GUI下启动终端会话时出现。
登录 shell 会读取一个或多个启动文件,如下所示:
文件 内容
/etc/profile 应用于所有用户的全局配置脚本
˜/.bash_profile 用户个人的启动文件。可以用来扩展或重写全局配置脚本中的设置
˜/.bash_login 如果文件 ˜/.bash_profile 没有找到,bash 会尝试读取这个脚本
˜/.profile 如果文件 ˜/.bash_profile 或文件 ˜/.bash_login 都没有找到,bash 会试图读取这个文件。这是基于
Debian 发行版的默认设置,比方说 Ubuntu
非登录 shell 会话会读取以下启动文件:
文件 内容
/etc/bash.bashrc 应用于所有用户的全局配置文件
˜/.bashrc 用户个人的启动文件。可以用来扩展或重写全局配置脚本中的设置
除了读取以上启动文件之外,非登录 shell 会话也会继承它们父进程的环境设置,通常是一个登录 shell
因为上面列出的大多数文件名都以圆点开头(意味着它们是隐藏文件),需要使用带 “-
a
” 选项的ls
命令。 在普通用户看来,文件∼/.bashrc
可能是最重要的启动文件,因为它几乎总是被读取。非登录 shell 默认会读取它,并且大多数登录 shell
的启动文件会以能读取∼/.bashrc
文件的方式来书写
5. 一个启动文件的内容
如果看一下典型的
.bash_profile
文件(来自于 CentOS4 系统),它看起来像这样:
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
以 “#” 开头的行是注释,shell 不会读取它们。它们在那里是为了方便人们阅读。第一件有趣的事情发生在第四行,伴随着以下代码:
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
这叫做一个 if 复合命令,对它翻译一下:
If the file ~/.bashrc exists, then
read the ~/.bashrc file.
可以看到这一小段代码就是一个登录 shell 得到
.bashrc
文件内容的方式。在启动文件中,下一件有趣的事与PATH
变量有关系。 是否曾经对 shell 怎样知道在哪里找到在命令行中输入的命令感到迷惑?例如,当输入ls
后,shell不会查找整个计算机系统来找到/bin/ls
(ls 命令的全路径名),它查找一个目录列表,这些目录包含在PATH
变量中。PATH
变量经常(但不总是,依赖于发行版)在/etc/profile
启动文件中设置,通过这些代码:
PATH=$PATH:$HOME/bin
修改
PATH
变量,添加目录$HOME/bin
到目录列表的末尾。这是一个参数展开的实例,参数展开我们在第八章中提到过。为了说明这是怎样工作的,试试下面的例子:
$ foo="This is some"
$ echo $foo
This is some
$ foo="$foo text."
$ echo $foo
This is some text.
使用这种技巧可以把文本附加到一个变量值的末尾。通过添加字符串
$HOME/bin
到PATH
变量值的末尾,则目录$HOME/bin
就添加到了命令搜索目录列表中。这意味着当在自己的家目录下,创建一个目录来存储自己的私人程序时,shell已经给准备好了。剩下所要做的事就是把创建的目录叫做bin
注意:很多发行版默认地提供了这个PATH
设置。一些基于Debian 的发行版,例如 Ubuntu,在登录的时候会检测目录∼/bin
是否存在,若找到目录则把它动态地加到 PATH 变量中
有下面一行代码:
export PATH
这个
export
命令告诉 shell 让这个 shell 的子进程可以使用 PATH 变量的内容
6. 修改 shell 环境
既然知道了启动文件所在的位置和它们所包含的内容,就可以修改它们来定制自己的 shell 环境
7. 应该修改哪个文件?
按照通常的规则,添加目录到你的
PATH 变量
或者是定义额外的环境变量
,要把这些更改放置到.bash_profile
文件中(或者其替代文件中,根据不同的发行版。例如,Ubuntu 使用.profile
文件)。对于其它的更改要放到.
bashrc文件中。除非你是系统管理员,需要为系统中的所有用户修改默认设置,那么则限定你只能对自己家目录下的文件进行修改。有可能会更改/etc
目录中的文件,比如说profile
文件,而且在许多情况下修改这些文件也是明智的,但是要谨慎行事。
8. 文本编辑器
编辑(例如,修改)shell 的启动文件以及系统中大多数其它配置文件,使用一个叫做文本编辑器的程序。文本编辑器是一个在某些方面类似于文字处理器的程序,允许使用移动光标在屏幕上编辑文字。文本编辑器不同于文字处理器之处在于它只能支持纯文本,并且经常包含为便于写程序而设计的特性。文本编辑器是软件开发人员用来写代码,以及系统管理员用来管理控制系统的配置文件的重要工具
Linux系统有许多不同类型的文本编辑器可用;你的系统中可能已经安装了几个。为什么会有这么多种呢?可能因为程序员喜欢编写它们,又因为程序员们会频繁地使用它们,所以程序员编写编辑器让它们按照程序员的愿望工作
文本编辑器分为两种基本类型:图形化的
和基于文本的编辑器
。GNOME
和KDE
两者都包含一些流行的图形化编辑器。GNOME
自带了一个叫做gedit
的编辑器,这个编辑器通常在GNOME
菜单中称为“文本编辑器”
。KDE
通常自带了三种编辑器,分别是(按照复杂度递增的顺序排列)kedit,kwrite,kate
有许多基于文本的编辑器。一些流行的编辑器是
nano、vi
和emacs
:
nano
编辑器是一个简单易用的编辑器,用于替代随PINE
邮件套件提供的pico
编辑器
vi
编 辑器(在大多数 Linux 系统中被vim
替代,vim
是“Vi IMproved”
的简写)是类 Unix 操作系 统的传统编辑器。
emacs
编辑器最初由Richard Stallman
写成。它是一个庞大、多用途的,可做任何事情的编程环境。虽然emacs
很容易获取,但是大多 数 Linux 系统很少默认安装它。
9. 使用文本编辑器
所有的文本编辑器都可以通过在命令行中输入编辑器的名字,加上你所想要编辑的文件来唤醒。如果所输入的文件名不存在,编辑器则会假定创建一个新文件。下面是一个使用
gedit
的例子:
$ gedit some_file
这条命令将会启动
gedit
文本编辑器,同时加载名为“some_file”
的文件,如果这个文件存在的话
所有的图形文本编辑器很大程度上都是不需要解释的。在启动
nano
并且编辑文件.bashrc
之前,先练习一些 “安全计算”。当编辑一个重要的配置文件时,首先创建一个这个文件的备份。这样能避免在编辑文件时弄乱文件。创建文件.bashrc
的备份文件,这样做:
$ cp .bashrc .bashrc.bak
备份文件的名字无关紧要,只要选择一个容易理解的文件名。扩展名
“.bak”、”.sav”、“.old”
和“.orig”
都是用来指示备份文件的流行方法。cp
命令会覆盖已经存在的同名文件。 现在启动nano
编辑器吧:
$ nano .bashrc
一旦
nano
编辑器启动后,将会得到一个像下面一样的屏幕:
GNU nano 2.0.3
....
注意:如果你的系统中没有安装
nano
编辑器,可以用一个图形化的编辑器代替。这个屏幕由上面的标头,中间正在编辑的文件文本和下面的命令菜单组成。因为设计nano
是为了代替由电子邮件客户端提供的编辑器的,所以它相当缺乏编辑特性。在任一款编辑器中, 应该学习的第一个命令是怎样退出程序。以nano
为例,输入Ctrl-x
来退出nano
。在屏幕底层的菜单中说明了这个命令。“ˆX” 表示法意思是Ctrl-x
。这是控制字符的常见表示法,许多程序都使用它。
第二个需要知道的命令是怎样保存的劳动成果。对于
nano
来说是Ctrl-o
。既然已经获得了这些知识,接下来准备做些编辑工作。使用下箭头按键和 / 或下翻页按键,移动鼠标到文件的最后一行,然后添加以下几行到文件.bashrc
中:
umask 0002
export HISTCONTROL=ignoredups
export HISTSIZE=1000
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
注意:出现重复的代码不会有其他影响。 下表是所添加行的意义:
文本行 含义
umask 0002 设置掩码来解决共享目录的问题
export HISTCONTROL=ignoredups 使得 shell 的历史记录功能忽略一个命令,如果相同的命令已被记录
export HISTSIZE=1000 增加命令历史的大小,从默认的 500 行扩大到1000 行
alias l.=’ls -d .* --color=auto’ 创建一个新命令,叫做’l.’,这个命令会显示所有以点开头的目录项
alias ll=’ls -l --color=auto’ 创建一个叫做’ll’ 的命令,这个命令会显示长格式目录列表
许多代码的意思直觉上并不是明显的,所以添加注释到文件
.bashrc
中是一个好主意,可以帮助理解。使用编辑器,更改添加的代码,让它们看起来像这样:
# Change umask to make directory sharing easier
umask 0002
# Ignore duplicates in command history and increase
# history size to 1000 lines
export HISTCONTROL=ignoredups
export HISTSIZE=1000
# Add some helpful aliases
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
当完成修改后,输入
Ctrl-o
来保存修改的.bashrc
文件,输入Ctrl-x
退出nano
。 Shell 脚本和 bash 启动文件都使用“#”
符号来开始注释。其它配置文件可能使用其它的符号。大多数配置文件都有注释。把它们作为指南你会经常看到配置文件中的一些行被注释掉,以此防止它们被受影响的程序使用。这样做是为了给读者在可能的配置选项方面一些建议,或者给出正确的配置语法实例。例如,Ubuntu 8.04 中的
.bashrc
文件包含这些行:
# some more ls aliases
#alias ll='ls -l'
#alias la='ls -A'
#alias l='ls -CF'
最后三行是有效的被注释掉的别名定义。如果删除这三行开头的
“#”
符号, 此技术程称为uncommenting
(取消注释),这样就会激活这些别名。相反地,在一行的开头加上“#”
符号,可以注销掉这一行,但会保留它所包含的信息
10. 激活修改
对于文件
.bashrc
的修改不会生效,直到关闭终端会话再重新启动一个新的会话,因为.bashrc
文件只是在刚开始启动终端会话时读取。强迫 bash 重新读取修改过的.bashrc
文件,使用下面的命令:
$ source .bashrc
运行上面命令之后就应该能够看到所做修改的效果了