前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第四章 shell和环境变量

第四章 shell和环境变量

作者头像
晓天
发布2019-07-04 11:27:07
8860
发布2019-07-04 11:27:07
举报

第四章 shell和环境变量

4.1 shell简介

4.1.1 编译器

一台计算机从基本架构上讲,由最基本的硬件组成硬件结构(如:cpu、内存、主板、声卡、显卡等),我们知道,硬件组成完备,但未安装操作系统的计算机被称为“裸机”。我们必须给“裸机”安装操作系统后,才可以正常使用。windows、Linux都属于操作系统范畴。

而我们安装完操作系统后,会在操作系统的基础上,后续安装各种应用软件,如:QQ、迅雷等。但是我们可以分析下,QQ、迅雷等软件,一般都是用java、C#、C++等编程语言编写的,这些编程语言我们称之为“高级程序语言”。而我们知道,计算机硬件只能职别二进制,即计算机硬件只可以运行二进制程序,称之为“机器语言程序”。那么,就需要有一个工具,可以把外围高级语言程序,翻译成计算机硬件可以执行的机器语言程序;并且,需要将硬件执行的二进制结果,再翻译回高级语言程序状态,交给外围程序显示。这种完成翻译工作的工具,我们称之为“命令解释器”,又称“编译器”。

从工作原理上讲,操作系统一般也由两部分组成:系统内核和编译器。系统内核负责计算机硬件的管理调度,如:支配磁盘读取数据,放入内存,再转入cpu执行。而编译器则负责把外围程序,翻译成内核可以识别的程序状态,支配硬件执行。具体结构,可参考下图:

而不同的操作系统,由于系统内核不同,所以也有各自不同的编译器,因此一种操作系统下的程序,无法在其他操作系统中执行。如:windows程序,无法在Linux中运行。

题外话,为了实现同一程序可以在不同操作系统上运行,java推出了自己独立的编译器:JDK。则在不同操作系统上安装对应版本的jdk后,同一个java程序即可在不同操作系统上运行了,所以我们经常称java解决了程序的跨平台问题。

那么,windows系统有自己的编译器(一般为.NetFramework系列),而Linux也有自己独立的编译器,Linux的编译器我们称为SHELL。

4.1.2 shell简介

shell是linux内核的一个外壳,它包在linux内核的外面,为用户和内核之间的交互提供了一个接口。当用户下达指令给操作系统的时候,实际上是把指令告诉shell,经过shell解释,处理后让内核作出相应的动作。而系统的回应和输出的信息也由shell处理,然后显示在用户的屏幕上。

shell有很多版本,如:bash、sh、ksh、csh等,RHEL系列默认使用bash。

4.2 命令分类

4.2.1 命令执行原理

我们先来对比一下windows,我们在windows的开始=>运行界面中输入命令,如:cmd(命令窗口)、mspaint(画图)、calc(计算器)等。

当在运行中输入命令执行时,windows实质是到c:\windows\system32\文件夹下去查找该命令对应的可执行程序并运行起来的,如图:

同样的道理,其实Linux中的命令,如:ls、cp、mv等,在系统中也都有其对应的可执行程序。我们可以使用如下命令查看得到

whereis ls ---查看指定命令对应的可执行程序和帮助文档的位置。如图

which ls ---查看指定命令的别名形态及可执行程序的位置

其中whereis显示结果中 /usr/bin/ls 是命令对应的可执行程序。/usr/share/man下所显示的文件是ls对应的帮助文档;which结果中alias行显示的是命令的别名。

注:关于命令别名,我们后续会有介绍

虽然whereis可查看到命令的可执行程序,但有些命令却查询不到,如:exit

具体原因请阅读下节内容。

4.2.2命令分类

Linux中,系统命令会根据命令程序所在位置不同,将命令划分为两大类:内建命令和外部命令。具体如下:

内建命令 ---又称内置命令

集成于系统shell之内,所以系统外部没有其对应的可执行程序,

内置命令可以直接运行,不需shell的编译;

内置命令使用whereis 时不可查

help ---查看所有内置命令

外部命令

位于系统的shell之外,有对应的可执行程序。

运行外部命令,会被shell编译后再交由内核执行;

外部命令 用whereis可查

内外部命令的应用,当下看来,好像区别不大,其实在将来的工作中,对于内外部命令的不同操作,会有很大的区别。就近而言,我们在之后的计划任务、sudo授权、shell编程等章节都会使用到外部命令的概念。

4.3 环境变量

4.3.1 环境变量的功能

我们还是从windows入手,前面讲过,当我们在开始=>运行中输入命令时,系统会到c:\windows\system32\文件夹下去查找该命令对应的程序。但是,读者们有没有会疑问:windows为什么会到这个文件夹下去查找,还有没有其他的文件夹下系统也会去查找呢?带着这个问题,我们来做如下操作:

右键 “计算机”=>属性=>左侧 “高级系统设置”=>下侧 “环境变量”

显示的就是windows的环境变量信息,如图:

在下侧的“系统变量”区域中,会看到path,这就是windows的一个环境变量。path的功能是,指定windows到哪些文件夹下去查找命令的可执行程序,相邻两项之间用;(分号)分隔。我们可以点击“编辑”按钮具体查看。

从此例可见,环境变量是表示系统中某一项工作状态的变量。我们可以这样去想:系统桌面的分辨率、桌面图标的字体大小、系统声音大小都是由变量做记录指定的。所以环境变量是任何一个系统都不可或缺的配置记录工具。

在Linux中,同样具备很多的环境变量来帮助系统记录各种配置。我们可以使用如下命令查看:

env ---查看系统环境变量

set ---查看所有环境变量

系统中常用的环境变量如下表:

环境变量

说明

LOGNAME

登陆名,也就是账户名

PATH

命令搜索路径

PS1

命令提示符

PWD

用户的当前目录

SHELL

用户的shell类型

TERM

终端类型

HOME

用户主目录的位置,通常是/home/用户名

表中值得注意的是:PATH、PS1、SHELL、HOME几个变量在工作中使用率较高,需要关注。

我们也可以使用echo命令输出环境变量的值。

echo $PATH ---$符表示提取变量的值,注:环境变量都为大写

另外,既然环境变量属于变量类型,则它是可以人为更改的,下面我们就来看一下如何更改环境变量的值。

4.3.2 更改环境变量的值

我们可以直接使用=为环境变量设置新的值,称为赋值操作,如:

PS1=”{\u@\h \t \W}\\$” ----更改命令提示符的显示格式,效果如下

命令中参数解释:\u用户名 \h主机名 \t时间 \d日期 \W当前相对路径

\w当前绝对路径 \\$身份符

命令中未使用的参数,读者可自行尝试一下,查看效果。

注:\符的功能是提取后面字母的特殊含义,具体操作会在下一章中做讲解

\\$是身份符的特定表示格式,因为$符在Linux中的含义较多,所以使

用\\$的格式。

在很多其他学习资料中会使用 export 变量=”值” 的格式配置环境变量的值。其实用不用export关键字对环境变量赋值,会有使用范围(又称为生存期)上的区别,但是对于我们初学者来说,效果基本差不多,所以在这里我们暂时不做过多的解释,大家可以理解为用不用export都可以实现赋值功能。有兴趣的读者也可以查阅相关资料加以区分。

4.4 环境变量配置文件

4.4.1重启失效的原因

我们更改了环境变量,当注销或重启后会发现所做的设置失效了,这是为什么么呢?其实Linux和unix一样,对于系统运行状态的配置会有专门的文件进行记录,我们称之为配置文件,配置文件都记录在磁盘上,系统的每项设置都会有专用的配置文件做记录。

当开机时,Linux会从磁盘上读取配置文件到内存中,日常手动输入命令做的系统更改是生效给了内存中的配置信息,并未更改磁盘上的配置文件,而内存中的数据会在注销或重启后清空,所以在系统注销或重启后,配置失效。

因此,必须手动编辑、更改磁盘上的配置文件,才能永久生效。

4.4.2配置环境变量配置文件

Linux关于环境变量的配置信息,有专用的环境变量配置,它分为两类:系统环境变量配置文件、个人环境变量配置文件。

系统环境变量配置文件

针对整个Linux系统生效,所有账号登录后都会遵守

/etc/bashrc(针对shell) /etc/profile(针对外围程序)

个人环境变量配置文件

每个用户都会有其独有的个人配置文件,针对单个用户生效,不影

响其他用户

$HOME/.bashrc(针对shell)

$HOME/.bash_profile(针对外围程序)

$HOME/.profile(功能与.bash_profile相同,默认不存在)

我们可以根据需要,编辑配置文件,以完成重启生效的配置。实验如下

vi /etc/profile ---在开头部分写入

PS1="{\u@\h \t \W}\\$"

注销或重启后查看效果

文件内容说明:该文件中开头部分会有很多#开头的文字。在Linux中,文档中以#开头的都是注释内容。注释,即计算机在执行、查看文件时会掠过、不做处理的文字,一般是给使用者做些说明解释作用的文字。

另外,更改环境变量配置文件后,新的配置重启后,如果进入的是GUI图形界面,打开终端窗口后,会无效过;但重启后若进入字符界面,则效果明显,具体原因我们将在shell编程章节中做解释。

4.4.3命令别名

Linux中还有一个较为使用的功能就是为命令设置别名。我们可以想象以下,如果有一个命令我们经常使用,但是命令又比较复杂,每次输入比较麻烦,那么我们可以定义一个简洁的命令来替代该复杂的命令,称为命令别名。

如:cd /etc/sysconfig/network-scripts 该目录为Linux的网卡文件的存放位置,如果我们工作中会经常进入该目录做操作,那么我们就可以为该命令设置一个简洁的替代命令。命令如下:

alias wk="cd/etc/sysconfig/network-scripts" ---定义命令别名

则以后每次输入wk后,就等于输入了cd /etc/sysconfig/network-scripts。

alias ---查看系统中的命令别名

unalias wk ---取消命令别名

注:alias命令后可见到系统shell自带的和用户自定义的命令别名。

如:ll=”ls -l” 等

但是,与环境变量的特性相同,alias设置的命令别名,也只是临时生效的,注销或重启后即失效了,所以若想自定义的别名永久生效,也需要将设置命令写入到环境变量配置文件中。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 教主小筑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档