【Linux之shell 环境】

文章目录

  1. 什么存储在环境变量中?
  2. 检查环境变量
  3. 一些有趣的环境变量
  4. 如何建立 shell 环境?
  5. 一个启动文件的内容
  6. 修改 shell 环境
  7. 应该修改哪个文件?
  8. 文本编辑器
  9. 使用文本编辑器
  10. 激活修改

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/binPATH 变量值的末尾,则目录 $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系统有许多不同类型的文本编辑器可用;你的系统中可能已经安装了几个。为什么会有这么多种呢?可能因为程序员喜欢编写它们,又因为程序员们会频繁地使用它们,所以程序员编写编辑器让它们按照程序员的愿望工作
文本编辑器分为两种基本类型:图形化的基于文本的编辑器GNOMEKDE 两者都包含一些流行的图形化编辑器。GNOME自带了一个叫做 gedit 的编辑器,这个编辑器通常在 GNOME 菜单中称为 “文本编辑器”KDE通常自带了三种编辑器,分别是(按照复杂度递增的顺序排列)kedit,kwrite,kate

有许多基于文本的编辑器。一些流行的编辑器是 nano、viemacs
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

运行上面命令之后就应该能够看到所做修改的效果了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值