Linux成长之路(三)——环境变量和搜索文件

来源:互联网 发布:sql查询分析器在哪里 编辑:程序博客网 时间:2024/05/21 14:46

一、环境变量

  • 变量
    这里所指的变量(Shell变量)可以看成编程语言中的变量,它也有自己的命名规则和变量类型,可以参与运算,有作用域限定。其实Shell本身也就是一种程序语言。
    使用“declare”命令创建一个变量:
    这里写图片描述
    可能有的读者会说declare命令似乎没有存在的意义,其实它在创建其它指定类型的变量(如数组)时会用到。

  • 环境变量
    环境变量就是作用域比自定义变量要大,如Shell 的环境变量作用于自身和它的子进程。在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,处理创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。Shell 程序也作为一个进程运行在操作系统之上,而我们在 Shell中运行的大部分命令都将以 Shell 的子进程的方式运行。
    这里写图片描述
    (图片来自实验楼)

    通常我们会涉及到的环境变量有三种:

    • 当前 Shell 进程私有用户自定义变量,如上面我们创建的 temp 变量,只在当前 Shell 中有效。
    • Shell 本身内建的变量。
    • 从自定义变量导出的环境变量。

    也有三个与上述三种环境变量相关的命令,set,env,export。这三个命令很相似,都可以用于打印相关环境变量,区别在于涉及的是不同范围的环境变量,详见下表:
    这里写图片描述
    这里写图片描述

    关于环境变量,可以简单的理解成在当前进程的子进程是否有效,有效则为环境变量,否则不是。

    不懂什么意思?不要紧,看到这儿我也一脸懵逼,再往后看。

    我们这里用export命令来体会一下,先在 Shell 中设置一个变量father,然后再新创建一个子 Shell 查看father变量的值:
    这里写图片描述
    解释:可以理解为【father=45】为一个普通变量,而【export father=50】为导出father为环境变量。
    注意:Ubuntu默认Shell为bash,有bash,ksh,csh,tsh,zsh,置于他们的不同可以在网上自己查查。
    为了与普通变量区分,通常我们习惯将环境变量名设为大写

  • 命令的查找路径与顺序
    在Windows系统中,我们经常配置环境变量PATH,Linux中也一样需要配置环境变量,我们在Shell中输入的命令,也就是通过环境变量给的路径去查找的。除了系统自带的我们也可以自定义环境变量。
    查看环境变量:
    这里写图片描述
    (注意环境变量和程序代码中的变量一样区分大小写)
    上述目录中的文件通常是一些可执行文件当我们在 Shell 中执行一个命令时,系统就会按照 PATH 中设定的路径按照顺序依次到目录中去查找,如果存在同名的命令,则执行先找到的那个。

    实验:我们先用C语言在用户gcg家目录下写一个程序,再用gcc(C语言编译器)编译,在gcg家目录中可以直接运行生成的可执行二进制文件,但是当返回上级目录再 想运行可执行文件时却找不到命令。

    • 第一步:C语言程序 hello.c:输出hello world!
      这里写图片描述
    • 第二步 :gcc编译hello.c,gcc编译后的二进制文件默认是可执行的。
      这里写图片描述
    • 第三步:执行二进制文件hello:
      这里写图片描述
    • 第四步:返回其他目录再执行hello,找不到hello命令了:
      这里写图片描述
      说明:加上命令的完整路径可以执行hello命令,
      这里写图片描述
      但那样很不方便,如何做到想使用系统命令一样执行自己创建的脚本
      文件或者程序呢?那就要将命令所在路径添加到PATH环境变量了。
  • 添加自定义路径到“PATH”环境变量
    先看看添加PATH之后运行可执行文件hello的效果:
    这里写图片描述
    我们是怎么做到的,其实就是在PATH变量后面跟着加上hello所在目录的完整路径,注意是完整路径,直接上图:
    这里写图片描述

    问题来了:因为添加的是PATH环境变量,所以我们用bash创建子Shell之后hello命令仍然有效,不过一旦关闭当前终端,在此进入,你会发现PATH中的加的:/home/gcg已经不存在了,而且hello也不能在其他目录执行了。怎么办?

    解决方法:在每个用户的 home 目录中有一个 Shell 每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等等。 Bash 的配置文件为.bashrc。它们在etc下还都有一个或多个全局的配置文件,不过我们一般只修改用户目录下的配置文件:
    这里写图片描述
    (我试过了,添加后在.bashrc文件追后确实存在:/home/gcg/,不过不知道为什么,hello还是不能直接执行。)
    (补充: 后来我在是实验楼上做了一遍,结果成功了,实验楼的Shell是zsh,我用的Ubuntu是bash,当然前提是要重启终端之后才会生效)

  • 修改和删除已有变量

    • 变量修改
      变量的修改主要是一下几种方式:
      这里写图片描述
      演示:
      从尾向前开始匹配:
      这里写图片描述
      将符合旧字串全部替换为新串
      这里写图片描述

    • 变量删除
      这里写图片描述

  • 如何让环境变量立即生效
    在上面我们在 Shell 中修改了一个配置脚本文件之后(比如 zsh 的配置文件 home 目录下的.zshrc),每次都要退出终端重新打开甚至重启主机之后其才能生效,很是麻烦,我们可以使用source命令来让其立即生效(source命令也可以用“.”代替,注意”.”后面有一个空格,而且用“.”的话,后面必须是完整的路径名或者相对路径,而source则不需要)。

二、搜索文件

  • whereis简单快捷
    whereis只能搜索二进制文件(-b),man帮助文件(-m)和源代码文件(-s)

  • locate快而全
    通过”/var/lib/mlocate/mlocate.db”数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行updatedb命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次updatedb命令

  • which小而精
    which本身是 Shell 内建的一个命令,我们通常使用which来确定是否安装了某个指定的软件,因为它只从PATH环境变量指定的路径中去搜索命令

  • find精而细
    find应该是这几个命令中最强大的了,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。
    这几个命令都比较简单,可以自己试试。

参考文献:https://www.shiyanlou.com/courses/1

注:转载请注明原文出处:
作者:CUG_UESTC
出处:http://blog.csdn.net/qq_31192383/article/details/52823199

1 0