shell中文件路径用变量定义_第四章 shell和环境变量

第四章 shell和环境变量

4.1    shell简介

4.1.1 编译器

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

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

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

445d0b43b9899b9c6e8b865ce12b35c4.png

而不同的操作系统,由于系统内核不同,所以也有各自不同的编译器,因此一种操作系统下的程序,无法在其他操作系统中执行。如: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(计算器)等。

bcfc6a71f07b1404bad9eb4e4221c47a.png

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

9e3084e0ad0edf9805bba2537de95e6b.png

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

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

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

3e4c5faab287d241df952ce2b884c41f.png

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

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

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

5bec9800aed78bd8e06149ac04b034dd.png

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

4.2.2命令分类

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

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

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

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

    内置命令使用whereis 时不可查

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

外部命令

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

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

 外部命令 用whereis可查

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

4.3 环境变量

4.3.1 环境变量的功能

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

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

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

24c4d1c27b7124b2b4adc271bf7a3f19.png

在下侧的“系统变量”区域中,会看到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}\\$”    ----更改命令提示符的显示格式,效果如下

1fa6a2caa000160a4d43febac91e9938.png

命令中参数解释:\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设置的命令别名,也只是临时生效的,注销或重启后即失效了,所以若想自定义的别名永久生效,也需要将设置命令写入到环境变量配置文件中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值