[笔记]快乐的Linux命令行《十一》shell 环境

48 阅读8分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

前言

一、Shell环境

shell 在 shell 会话中维护着大量的信息,这些信息称为 (shell)环境。存储在 shell 环境中的数据被程序用来确定配置属性。然而大多数程序用配置文件来存储程序设置,某些程序也会查找存储在 shell 环境中的数值来调整他们的行为。 在这一章,我们将用到以下命令:

  • printenv –打印部分或所有的环境变量
  • set –设置 shell 选项
  • export —导出环境变量,让随后执行的程序知道。
  • alias –创建命令别名

1.1 什么存储在环境变量中

shell 在环境中存储了两种基本类型的数据,虽然对于 bash 来说,很大程度上这些类型是不可辨别的:

  • 环境变量
  • shell 变量。

Shell 变量是由 bash 存放的一很少数据,而环境变量基本上就是其它的所有数据。

除了变量,shell 也存储了一些可编程的数据,命名为别名shell 函数

1.2 检查环境变量

  • 我们既可以用 bash 的内部命令 set
  • 或者是 printenv 程序来查看什么存储在环境当中。

set命令可以显示 shell 和环境变量两者,而 printenv 只是显示环境变量。

printenv命令

因为环境变量内容列表相当长,所以最好把每个命令的输出结果管道到 less 命令

[me@linuxbox ~]$ printenv | less

printenv 命令也能够列出特定变量的数值,

如下访问USER变量:

[me@linuxbox ~]$ printenv USER
me

set命令

set命令可以显示 shell 和环境变量两者 set 命令的输出结果很礼貌地按照字母顺序排列:

[me@linuxbox ~]$ set | less

echo打印环境变量

也可以通过 echo 命令来查看一个变量的内容,像这样:

[me@linuxbox ~]$ echo $HOME
/home/me

alias 查看别名变量

如果 shell 环境中的一个成员既不可用 set 命令也不可用 printenv 命令显示,则这个变量是 别名。 输入不带参数的 alias 命令来查看它们

[me@linuxbox ~]$ 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'

1.3 一些有趣的变量

shell 环境中包含相当多的变量,虽然你的 shell 环境可能不同于这里展示的,但是你可能会看到以下变量在你的 shell 环境中:

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=kde
HISTSIZE=1000
XDG_SESSION_COOKIE=6d7b05c65846c3eaf3101b0046bd2b00-1208521990.996705
-1177056199
GTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/home/me/.gtkrc-2.0:/home/me/.kde/share/config/gtkrc-2.0
GTK_RC_FILES=/etc/gtk/gtkrc:/home/me/.gtkrc:/home/me/.kde/share/config/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:

image.png

image.png

注意: 如果缺失了一些变量,不要担心,这些变量会因发行版本的不同而不同。

1.4 如何建立 shell 环境

当我们登录系统后,启动 bash 程序,并且会读取一系列称为启动文件的配置脚本,这些文件定义了默认的可供所有用户共享的 shell 环境。

然后是读取更多位于我们自己主目录中的启动文件,这些启动文件定义了用户个人的 shell 环境。精确的启动顺序依赖于要运行的 shell 会话类型。

有两种shell 会话类型:

  • 一个是登录 shell 会话
  • 另一个是非登录 shell 会话。

登录 shell 会话会提示用户输入用户名和密码;例如,我们启动一个虚拟控制台会话。当我们在 GUI 模式下运行终端会话时,非登录 shell 会话会出现。

登录 shell 会读取一个或多个启动文件,正如表 12 - 2 所示: image.png

非登录 shell 会话会读取以下启动文件: image.png

除了读取以上启动文件之外,非登录 shell 会话也会继承它们父进程的环境设置,通常是一个登录 shell。

浏览一下你的系统,看一看系统中有哪些启动文件。

记住-因为上面列出的大多数文件名都以圆点开头(意味着它们是隐藏文件),你需要使用带 “-a” 选项的 ls 命令。

在普通用户看来,文件 ∼/.bashrc 可能是最重要的启动文件,因为它几乎总是被读取。

非登录 shell 默认会读取它,并且大多数登录 shell 的启动文件会以能读取 ∼/.bashrc 文件的方式来书写。

1.5 一个启动文件的内容

我们看一下典型的.bash profifile 文件(来自于 CentOS 4 系统),它看起来像这样:

# .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 复合命令 (我们将会在第五部分详细地介绍它).

上面代码的含义是: 如果文件~/.bashrc存在,则读取~/.bashrc文件内容

修改PATH变量

PATH 变量经常(但不总是,依赖于发行版)在/etc/profifile 启动文件中设置,通过这些代码:

PATH=$PATH:$HOME/bin

修改 PATH 变量,添加目录 $HOME/bin 到目录列表的末尾

[me@linuxbox ~]$ foo="This is some"
[me@linuxbox ~]$ echo $foo
This is some
[me@linuxbox ~]$ foo="$foo text."
[me@linuxbox ~]$ echo $foo
This is some text.

注意:很多发行版默认地提供了这个 PATH 设置。一些基于 Debian 的发行版,

例如Ubuntu,在登录的时候,会检测目录 ∼/bin 是否存在,若找到目录则把它动态地加到 PATH变量中。

export命令

export PATH

这个 export 命令告诉 shell 让这个 shell 的子进程可以使用 PATH 变量的内容。

1.6 修改 shell 环境

既然我们知道了启动文件所在的位置和它们所包含的内容,我们就可以修改它们来定制自己的 shell 环境。

1.7 我们应该修改哪个文件

添加目录到你的 PATH 变量或者是定义额外的环境变量,要把这些更改放置到.bash_profile 文件中(或者其替代文件中,根据不同的发行版。例如,Ubuntu 使用.profifile 文件)。

对于其它的更改,要放到.bashrc 文件中。除非你是系统管理员,需要为系统中的所有用户修改默认设置,那么则限定你只能对自己主目录下的文件进行修改。

当然,有可能会更改/etc 目录中的文件,比如说 profile 文件,而且在许多情况下,修改这些文件也是明智的,但是现在,我们要安全起见。只修改用户目录下的./bash_profile

1.8 文本编辑器

为了编辑(例如,修改)shell 的启动文件,还有系统中大多数其它配置文件,我们使用一个叫做文本编辑器的程序。

文件编辑器是一个,在某些方面,类似于文字处理器的程序,比如说随着鼠标的移动,它允许你在屏幕上编辑文字。只有一点,文本编辑器不同于文字处理器,就是它只能支持纯文本,并且经常包含为便于写程序而设计的特性。

文本编辑器是软件开发人员用来写代码,和系统管理原员用来管理系统配置文件的重要工具。

Linux 系统有许多不同类型的文本编辑器可用;你的系统中可能已经安装了几个。为什么会有这么多种呢?可能因为程序员喜欢编写它们,又因为程序员们会频繁地使用它们,所以程序员编写编辑器让它们按照程序员自己的愿望工作。

文本编辑器分为两种基本类型:

  • 图形化的和基于文本的编辑器。

GNOME 和 KDE 两者都包含一些流行的图形编辑器。GNOME 自带了一个叫做gedit的编辑器,这个编辑器通常在GNOME 菜单中称为 “文本编辑器”。 KDE 通常自带了三种编辑器,分别是(按照复杂度递增的顺序排列)kedit,kwrite,kate。

有许多基于文本的编辑器。你将会遇到一些流行的编辑器,它们是 nano,vi,和 emacs。

这个 nano 编辑器是一个简单的,容易使用的编辑器,它是 pico 编辑器的替代物,pico 编辑器由PINE 邮件套件提供。

vi 编辑器(在大多数 Linux 系统中被 vim 替代,vim 是 “Vi IMproved”的简写)是类似于 Unix 操作系统的传统编辑器。

vim 是我们下一章节的讨论对象。

emacs 编辑器最初由 Richard Stallman 写成。emacs 是一个庞大的,多用途的,可做任何事情的编程环境。虽然 emacs 很容易获取,但是大多数 Linux 系统很少默认安装它。

1.9 使用文本编辑器

使用gedit:

[me@linuxbox ~]$ gedit some_file

这条命令将会启动 gedit 文本编辑器,同时加载名为 “some fifile” 的文件,如果这个文件存在的话。

1.10 激活我们的修改

我们对于文件.bashrc 的修改不会生效,直到我们关闭终端会话,再重新启动一个新的会话,因为.bashrc 文件只是在刚开始启动终端会话时读取。

然而,我们可以强迫 bash 重新读取修改过的.bashrc 文件,使用下面的命令:

[me@linuxbox ~]$ source .bashrc

运行上面命令之后,我们就应该能够看到所做修改的效果了。试试其中一个新的别名:

[me@linuxbox ~]$ ll

总结

在这一章中,我们学到了用文本编辑器来编辑配置文件的必要技巧。

随着继续学习,当我们读到命令的手册页时,记录下命令所支持的环境变量。可能会有一个或两个宝贝。在随后的章节里面,我们将会学习 shell 函数,一个很强大的特性,你可以把它包含在 bash 启动文件里面,以此来添加你自定制的命令宝库。