SHELL 命令解释器 普通 环境变量 .bashrc .bash_profile /etc/profile /etc/bashrc 超详细讲解

目录        什么是 SHELL 

               SHELL  中的变量 

              普通变量

               环境变量 

              环境变量实操

什么是 SHELL 

   

    概念解析  :   

                              SHELL  :  壳,  命令解释器 ,负责解析用户输入的命令。 

                                              它是系统的用户界面, 提供了用户与内核进行交互操作的一种接口。

                               图示:

                              

                               注 :   结合上图所示就可以看到,无论是 用户 还是 应用程序 将指令传递过来

                                          都是要经过 SHELL 的才能 传到内核中去,传到 SHELL 后,SHELL 进

                                          行解析,解析成内核可执行的指令后再传给内核,内核再执行,内核执

                                          行无非就是操作硬件,内核执行完后将结果便再回传给 SHELL 。 

                                          SHEL  再将 结果反馈给 用户或者 应用程序。  

                                 

                                  内置命令 与 外置命令  

                                          如何辨别 一个命令 是 内置命令 还是 外置命令  ?

                                          我们通过 使用 命令 type  来辨别 内置还是外置 !!

                                          内置命令 :  type 会 显示  builtin  意思该命令为 内置命令

                                                              示例  :     

[root@localhost ~]# type pwd
pwd is a shell builtin

                                                              上示就表示  pwd  为 内置命令

                                            外置命令 : type  会显示 该命令所属的二进制文件的路径。

                                                                示例 :

[root@localhost ~]# type man
man is /usr/bin/man

                                                                上示就表示的是  man 命令是一个外置命令,因为给出了

                                                                man  所属二进制文件的路径 。

                          :  SHELL 如何知道命令的可执行文件在哪个路径下呢 ??

                                       

                                    例如 :  SHELL 如何知道 cat 这个命令是在哪个路径下呢 ?

                                                   逻辑如下 :  当我们执行 cat 命令的时候,  SHELL 是会先在环

                                                                        境变量的路径下去搜索,搜索什么呢 ? 搜索 看看

                                                                        有没有  cat 命令的二进制文件,如果有的话则直接

                                                                       执行命令,如果没有,则会显示 command not found 

                        

                                    所以,根据上示逻辑提到的  环境变量 , 将是上述问题的答案 

                                    系统为了让用户在命令行快速方便的执行命令,将可执行文件的路径存储在

                                    环境变量 PATH 中。( 系统指定在了一个 特殊的环境变量 叫做 PATH )

                                     

                                    演示  :       我们仍以 cat 命令示意 :

                                                                                

                                     #   : 我们之前学过搜索命令的命令——  whereis  

                                              我们用  whereis  搜索 cat  显示出 cat 命令在 /usr/bin/cat 这个路径下

                                              然后我们用 echo $  去访问 环境变量 PATH  : 

                                              根据显示 SHELL 会先去 /usr/local/sbin 搜索,结果没有, 再去

                                              /usr/local/bin 搜索,结果也没有,再去 /usr/sbin 搜索,结果还是没

                                              有,接着再去 /usr/bin 搜索,结果有了 ,因为我们先用 whereis 搜

                                              索 cat 命令  显示 cat 命令就在 /use/bin 这个路径下!! 

                                             

                                              因此,综上, SHELL  如何知道命令的可执行文件的过程就是上示演

                                              示的全过程!!!

                            

  

SHELL  中的变量 

        概念导入  : 

                                   #      提起 “ 变量 ”  这个名词,我们在什么知识都没有学习的情况下,最先想

                                          到的肯定就是  “ 什么叫变量 ?? ” 

                                          我们最简单的理解  :  变量 ——  变化的量   

                                          随着知识的不断学习,当我们提起变量,自然也就会想到 一个可以指代

                                          变量的名词 ——  “ 变量名 ”  

                                     

                                   #      变量名  与  变量 的关系  :

                                                       当我们定义了变量后,我们想要访问变量的时候,通过什么访

                                                       问? ——  自然是通过变量名去访问变量的。

                                       

                                   #     接下来在看 我们官方对 变量  的定义 :

                                          官方  :  

                                                        变量  : 简单说就是让某一个特定字符串代表不固定的内容。

                                                        看到上示的定义解析一下 :

                                                                      特定字符串 : 就是 变量名 

                                                                   不固定的内容:  就是这个变量实际指的内容它是不固

                                                                                             定的,是可变的,这也就响应了我们最

                                                                                             初理解变量的内容,变量——变化的量

 SHELL 中的变量  :              

                                                 #     在 SHELL 中 变量分为两大类  “ 环境变量 ”  和  “ 普通变量 ”

                                                        环境变量 也叫  全局变量    ;  普通变量 也叫   局部变量 

普通变量 

                   普通变量   : 

                                        简单 : 就是只在 局部才能使用 的变量 。

                                        官方 : 只能在创建它们的 SHELL 函数 或 SHELL 脚本中使用,普通变

                                                     量一般由开发者在开发脚本程序时创建。

                                        示例 :  

                                                                 

                                               上示代码表示的含义是 :

                                                     定义了一个 名叫 data 的变量,给其赋的值为 1 。先不管如何定

                                                     义变量,这个我们后期会讲解到;

                                                     定义data变量后,我们访问 data 变量,显示其值为 1。 

                                                  (前面我们学习了 访问变量是用 echo $ + 变量名来访问的

                                                    我们得到了 变量 Data 的值,说明我们访问成功了;大家可以看

                                                    到在上示图中我用两个黄色线条画了两个圈,其中最上面的那个

                                                    小圈,圈的是什么意思呢? ——  它的含义是 当前的会话窗。

                                                    

                                                     为了更好的理解  普通变量(全局变量)我们再创建一个新的 会

                                                     话窗口,再次访问 Data 变量,来看看还是否能够访问?

                                                     

                                                     结合上图所示 :

                                                                  我们只是复制了会话,然后,想要 再次访问 Data  变量

                                                                  就会发现 并没有显示 Data 变量的值 。

                                                                  这说明什么??

                                                                  说明在新复制的会话里面,没有访问到 Data 变量。

                                                      结合对比提出几个问题 :

                                                                 当第一次我们定义了 Data 变量,并且能够成功访问这个

                                                                 变量(显示它的值!) 。

                                                                 #   那么这个变量是在哪里定义的 ? ? ?

                                                                      是  root 用户当前登录到SHELL环境里定义的!!

                                                                 #   那么为什么第二次复制了会话后,就不能访问Data变

                                                                      量了(没有显示Data变量的值)???

                                                                      因为重新复制会话或者重新建立连接,意味着改变了

                                                                      SHELL 环境。

               设置变量(规则) 

                                                                #  只能使用数字、字母下划线、且不能用数字开头

                                                                #  变量名和变量值用 “ =  ”  连接

                                                                #   等号两边不能有 空格符 

             变量赋值的五种写法 : 

                                                                 #    Bliang=value

                                                                        上示 就是最最基本的 变量的表示 ,含义就是 现在

                                                                        给 一个叫做 Bliang 的变量名 赋值为 value                 

                                                                 #    Bliang_1=' value '

                                                                        同理 : 变量名为 Bliang_1  赋的值为 value 

                                                                        区别 : 在于 值 value  加了一对 单引号  'value' 

                                                                                     那么  ' '  的意义是什么呢 ??

                                                                                     就是 :  引号里面是啥 就原封不动的 显示啥

                                                                                     还有一层含义在 下面的 里解释。

                                                                  #    Bliang_2="value"

                                                                        同理 : 变量名为 : Bliang_2  赋的值为双引号 " "

                                                                                     里面的东西(但又不纯粹是原封不动)

                                                                                     详解 看下面的 里解释

                                                                    Bliang_3=`pwd`

                                                                        这个又与上示三个有着 不同,它给值加的是 反引号

                                                                        ` `   显然 反引号里面 的内容不同于 前面几个,是

                                                                        pwd  是 命令 !!!

                                                                        是的 反引号 ` ` 里面只能是命令,不能是字符串!

                                                                  #    Bliang_4=$(pwd)

                                                                        这种形式和 上面反引号的含义是一模一样的,完全

                                                                        相同。 括号里面只能放命令,是把命令执行成功后

                                                                        的内容赋给变量!!!!     

                                                                 

               注    注    注       注 :  

                                                        #   上示 五种 都是变量的表示方法

                                                        #   本条 先来解释下 表示的前三个 :

                                                             Bliang=value    Bliang_1=' value '    Bliang_2="value"

                                                             我们明显可以看到 上示三种表示 最大的区别在于                             

                                                                          第一和 第二 三 的 带不带引号

                                                                          第二和 第三 的 单引号 还是 双引号

                                                             

                                          带不带引号  :

                                                               首先 单单仅就 当赋的值 为 value 来说 : 三种方式的赋值

                                                               当访问变量时,显示的结果是完全一样的,都是显示值。

                                                               那么,如此看来 似乎没有区别,带不带引号结果都一样,

                                                               答案是否定的,请再看接下来的示例 :

                                                                 上示就表示了 带与不带 引号(无论是单引号,还是双引

                                                                 号)的区别 :

                                                                  不带引号的时候,变量赋值 如果 赋的值 比较多,并且

                                                                  中间用了空格分开来,那么,赋值则是失败的,因为这

                                                                  一长串会自动被系统当做了命令来处理,可以看上示第

                                                                  一行代码失败后给出的解释 : command not found... ;

                                                                  我们明明是做的 变量的赋值,解释却是 没有找到命令,

                                                                  这就说明 系统把你要赋的一长串的值当做了命令来处

                                                                  理。

                                                                  而当给同样长的 值 加上 引号,无论是 单引号,还是双

                                                                  引号,当进行访问变量的时候 都是有效的!!!!

                                                                  结 : 带不带引号 :

                                                                           带 :赋的值可以为 很长的字符串

                                                                       不带 :赋的值只能 为单个字符串,不能有空格。

                                 单引号与双引号   :                                   

                                                              先对上示各行命令做以解释:

                                                                             我们对三个变量分别进行赋值 可以看到的是 给

                                                                             单引号 和 双引号 里放的内容是一样的 都是

                                                                             $Bliang1 ; ( $Bliang1 的意思是提取 变量 Bliang1

                                                                             的值 )   但是可以看到的是 当对同一个值 分别加

                                                                             上不同的引号,则访问变量时 显示出的结果是不

                                                                             一样的。

                                                                             结  : 

                                                                             单引号 : 引号里面的内容是什么,访问变量时就

                                                                                             显示什么,原封不动!!!! 

                                                                             双引号 : 它是先对引号里面的内容运行了一

                                                                                              下,将运行后的结果作为 值 赋给变量

                                                                                               而后,等访问变量的时候 访问的值就

                                                                                               是刚才 引号里面先运行后的值!!!           

                                                                                               但是,当双引号里面的值 不是特殊的

                                                                                               内容的时候(就像上面 $Bliang1,代表

                                                                                               提取内容的时候),那它就和 单引号

                                                                                               没啥区别。

                                                   #   反引号举例 :                                                

                                                       当给  变量名为 data  赋值为 ` 3 `  则报错  原因是 反引号下的内

                                                       容 3  压根就不是命令。 

                                                       当给  变量名为  Bliang 赋值为 ` pwd `  没有报错,反而能够访

                                                       问变量成功显示的值为 /root ,这是因为 反引号下的 pwd 就是

                                                       命令,/root 就是 由 pwd 命令执行成功的内容!!

                                                       结 

                                                                  也就是说 `` 的作用就是 里面只能放 命令,是把 命令执

                                                                  行成功后的值赋给变量。

                                        

                                                        

                                                                

                                                                                                                                            

环境变量

              官方定义  : 环境变量 也可以称为 全局变量,可以在创建它们的 Shell 及其派生出来的任

                                   意子进程 SHELL 中 使用。

                                   #  环境变量 也叫 全局变量 它的特点就是 在任何地方都可以访问得到。

                                   注 : 针对上示 # 也要提到一些内容 :

                                            在我们系统中有三种用户类型 :

                                                       超级用户(超级管理员用户 root);

                                                       普通用户

                                                       系统用户(这个不需要管,这是在安装系统的时候就已经创建

                                                                          的用户)

                                             所以,我们经常要用到的用户就是 超级用户 和 普通用户了;

                                             所以需要注意到的是 :  有针对某一个用户的环境变量,也有针对所

                                                                                    有用户的环境变量,这两个概念是完全不一

                                                                                    样的!!!!

             

             分类         :  环境变量可以分为  自定义环境变量  和   bash 内置的环境变量 

                                   

                                   bash 内置的环境变量  : 用于定义 SHELL 的运行环境,保证 SHELL 命令

                                                                            的正常执行,SHELL 通过环境变量来确定 :

                                                                            登录用户名命令路径终端类型登录目录等。

                                  自己定义的环境变量   : 自定义环境变量可以在命令行中设置和创建,但用

                                                                          户退出命令时这些变量值就会丢失。如果希望

                                                                          永久保存环境变量,可以在用户 家目录下的

                                                                          .bash_profile .bashrc 文件中,或者全局配置

                                                                           / etc / bashrc  或 / etc / profile 文件中定义,在将

                                                                           环境变量  放入上述  文件中后,每次用户登录时这

                                                                           些变量都将被初始化。

                                                               

                                 注  :   针对 自定义的环境变量,我们要重点放在 :

                                              在哪进行自定义 ??  

                                              怎么定义变量?? 格式是什么??

                                              首先  自定义变量 分为两种 : 临时定义        永久定义   

                                    #  临时定义 : 在命令行中定义

                                                             特点 : 就是临时性,只要用户一退出,定义的变量就将不

                                                                          复存在,下次想访问变量,则没法访问!!

                                                             格式 :  变量=值   

                                                             示例 : 

                                                              

                                                                注 : 上示  显然,我们在命令行中就进行了 变量的定义

                                                                         并进行访问,定义 变量 Bliang_1 给其赋值为 888

                                                                         然后,访问成功了,接着,断开了连接,然后再进

                                                                         行访问变量 Bliang_1 看看是什么结果,还能访问成

                                                                         功嘛?请看下图 

                                                                         

                                                                         显然,当断开链接后,再次访问 变量 Bliang_1,则

                                                                         访问失败,没有访问到 变量值!!!

                                                                          综上 : 就是 临时变量的定义格式及特点!! 

                                    #  永久定义 :  用户家目录   .bash_profile   .bashrc  

                                                             全局配置      /etc/profile  /etc/bashrc

                              永久定义的两种 : 用户家目录 和 全局配置它们的区别就在于 环境变量的适用

                                                             范围,当在用户家目录去定义的时候,说明什么,说明定义

                                                             的这个环境变量只能针对于你此时此刻的用户起作用,对于

                                                             其它用户是没有作用的,也就是说,只能在此时的用户下去

                                                             使用这个环境变量!!!其它的用户则不行!!!!

                                       了解文件  :  我们先来看看  .bash_profile    .bashrc   /etc/profile   

                                                                                     /etc/bashrc    里面的内容 

                                                               用户家目录 : .bash_profile    .bashrc 

                                                              .bash_profile  :

                                                           

                                                            #  可以看到 文件里面 还包含这一层关系(if 语句) 

                                                                 if 语句里面 告诉我们的就是 :

                                                                                    当执行 .bash_profile 的时候,如果里面包含

                                                                                    了  .bashrc 则也执行 .bashrc 。

                                                                                    就是说: 在执行 .bash_profile 的时候,也会

                                                                                                    顺便执行 .bashrc  !!!!

                                                           #   还圈住了一个内容(PATH)就是告诉我们 :

                                                                变量是如何定义的 ????

                                                                    NO 1 :  

                                                                                变量=值

                                                                                export   变量 

                                                                    NO  2 :

                                                                                export  变量=值 

                                                                     NO 3 : 

                                                                                 declare  -x  变量=值 

                                                                 

                                                                  再来看 .bashrc   

                                                                  .bashrc

                                                                 

                                                            #   在文件里还可以看到 白圈里的内容是我们 命令的别名的

                                                                 内容: 这就说明 我们在执行 rm cp mv 时,实际执行的

                                                                             是加了 -i  的命令!!

                                                                  我们在这个文件  .bashrc  找到了 命令别名的根本因

                                                                  也就是说当我们 使用 root 用户或者 其它用户登陆的时

                                                                  候系统就已经为我们加载了 这些环境变量,因此,才能

                                                                  在我们想要使用这些命令 rm cp mv 的时候 实际上才能

                                                                  够起到 -i  的作用!! 

                                                            从 if 语句(红圈)就能够看到,当执行 .bashrc 的时

                                                                 候,还要执行 /etc/bashrc !!!! 

                                                                 然而, /etc/bashrc 是干什么的?? 它是存储全局配置的

                                                                 也就是说 /etc/bashrc 定义的东西是真对所有用户的!!

                                                                 然而现在 : 我们家目录下的 .bashrc 当执行的时候还要

                                                                                     执行下 /etc/bashrc 意味什么

                                                                  意味着  :

                                                                                      在我们当前用户家目录里面的环境变量的设

                                                                                      置里去加载了全局的环境变量(也就是针对

                                                                                      所有用户的环境变量加载了下来)

                                                                                      再换言之 :

                                                                                      所谓的所有用户那肯定也包含着我 root

                                                                                   (即就是 当前用户,就你现在此时此刻的用

                                                                                      户)

                                                               再意味着  :  当前用户 即可以获取全部用户的环境变量

                                                                                     也有自己独有的环境变量!!!

                                                                                     公有的和独有的加在一起我都有!!!!

                                                                注   :  上面几句话不是很好理解,需要反复理解!!!

                                                                全局配置  :  / etc/ profile   / etc/ bashrc  

                                                                 /etc/profile :  

                                                                 

                                                                 可以看到,在执行 /etc/profile  顺便也会执行 /etc/bashrc 

                                                                /etc/bashrc :

                                                               

                                                                可以看到 此文件下面没有再需要执行的文件了!!

                                                                

                                    文件关系  :     

                                                                                          ​​​​​​​

                                                            执行顺序 : 先加载 /etc/profile 再加载 .bash_profile,在

                                                                                .bash_profile 下再加载 .bashrc  继而加载 

                                                                                 /etc/bashrc 

                                                                                还有一条路线是 /etc/profile 下有 /etc/profile.d

                                                                                /etc/profile.d 这是个目录,主要是存储执行的脚

                                                                                本文件  它里面的 .d 就是存放环境变量的一些

                                                                                可执行的脚本 !!!!

                                                        综上 : 上述全部的全部需要搞清下示几个问题(关于那四个文

                                                                      件)

                                                                       NO 1 :   如果我要定义针对所有用户的环境变量,我

                                                                                     应该写在哪??

                                                                       NO 2 :  如果我要定义某一个用户的环境变量,我应

                                                                                      该写在哪??

                                           

                                                         上图 :  也是 几个文件的相互关系,箭头的指向就是先执行后

                                                                       执行的顺序。

                                                         因此 :  可以解答 上示的 两个问题 !!!

                                                                       针对所有用户的环境变量

                                                                   .bash_profile    或者  .bashrc

                                                                       针对某一个用户的环境变量

                                                                    /etc/profile   或者  /etc/bashrc  再或者 /etc/profile.d 

                                                                   

                        综上的综上 :  就是当你想要定义一个环境变量的时候 

                                                 首先 ,思考要定义临时的环境变量还是 永久的环境变量,

                                                 如果是 临时环境变量,那没啥可说的,直接命令行定义就好,

                                                 如果是 永久环境变量,那么则,思考是要所有用户都可以访问的环

                                                 境变量还是只要当前用户可以访问就行!!!! 

                                                 如果是 所有用户都可以访问则在 /etc/profile 或者 /etc/bashrc 文件

                                                 里进行 自定义环境变量

                                                 如果是 只要某一个用户访问,则在 .bash_profile 或者 .basdrc 文件

                                                 里进行定义!!!

                                                 命令定义的格式 前面已经提过,就是那三种格式!!!!

                

        环境变量实操 :

                 只某一用户使用  :   在  .bash_profile  进行  变量定义 

                                                  

                                                  访问变量  :

                                                   

                                                   可以看到当 在 .bash_profile 定义变量后,我们需要再使用source

                                                   对文件进行一个加载,而后再访问 变量即成功!!!

                     针对所有用户  :    在  / etc /profile 进行变量定义 

                                                    

                                                    访问变量 :

                                                   

                                                    显然,也可以看到,当在文件定义完 变量后,也要用 source 

                                                    重新进行加载,而后访问成功!!!!

                                                     

                                                      

                 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值