环境变量与文件查找

环境变量

  Shell中的变量有类型但不用专门指定类型名,属于弱类型编程语言,可参与运算也有变量的作用域。
  declare temp //用declare预先声明一个变量
  也可以不用声明,直接即用即创建,像python变量一样:
  temp=shiyanlou //直接给变量赋值,等号两边不能有空格
  echo $temp //读取变量的值,要注意变量前的$符号,新手容易忘
  变量名与其他编程语言的变量一样,变量名只能是英文字母、数字或者下划线,且不能以数字作为开头。

  环境变量的作用域比自定义变量的要大,如 Shell 的环境变量作用于自身和它的子进程。每个进程都有自己的环境变量设置,在默认情况下,当一个进程被创建时,除了创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置,终端的 Shell 中运行的大部分命令(如cat,cd等)都将以 Shell 的子进程的方式运行。
在这里插入图片描述
通常涉及的变量有三种:

  • 当前shell中用户自定义的变量,如上面的temp变量,其只在当前shell窗口有效
  • Shell本身有很多内建的变量
  • 自定义的变量导出的环境变量

  也有三个与上述三种环境变量相关的命令:setenvexport。这三个命令很相似,都是用于打印环境变量信息,区别在于涉及的变量范围不同。
在这里插入图片描述
  关于哪些变量是环境变量,可以简单地理解成在当前进程的子进程有效则为环境变量,
  export temp //将自定义的temp变量导出为环境变量
  导出为环境变量后,该变量在不同的子shell中仍然有效(类似于当前进程的一个全局变量)
在这里插入图片描述
  但是关闭当前的 shell 之后,环境变量就没了。怎么才能让环境变量永久生效呢?
按变量的生存周期来划分,Linux 变量可分为两类:

  • 永久的:需要修改配置文件,变量永久生效;
  • 临时的:使用 export 命令行声明即可,变量在关闭 shell 时失效。

  两个重要文件,/etc/bashrc(存shell变量,有的Linux没有这个文件)和/etc/profile(存环境变量),另外每个用户目录下的一个隐藏文件.profile,隐藏文件可以用ls -a查看,修改.profile只对当前用户永久有效,修改/etc下的文件(位于根目录/)则对所有用户永久有效。

命令的查找路径与顺序

  我们在 Shell 中输入一个命令,Shell 是怎么知道去哪找到这个命令然后执行的呢?这是通过环境变量 PATH 来进行搜索的,PATH 里面就保存了 Shell 中执行的命令的搜索路径(环境变量一般用大写字母来表示)。
  echo $PATH //查看环境变量的内容
  一般显示的路径都是存放可执行文件的路径,当我们在 Shell 中执行一个命令时(如cat),系统就会按照 PATH 中设定的路径按照顺序依次到目录中去查找,如果存在同名的命令,则执行先找到的那个。
接下来我们创建一个shell脚本,
  gedit hello_shell.sh
在文件中添加内容(第一行不可省,这不是注释),

    #!/bin/bash 
    for ((i=0; i<10; i++));do 
        echo "hello shell" 
        done 
    exit 0

为文件添加可执行权限:
  chmod 755 hello_shell.sh
当前目录下执行脚本,
  ./hello_shell.sh
  如果将该脚本移动到其它目录下(如/home/shiyanlou/mybin),则再运行./hello_shell.sh会出错,除非加上命令的完整路径,但那样很不方便,如何做到像使用系统命令一样执行自己创建的脚本文件或者程序呢?那就要将命令所在路径添加到 PATH 环境变量了。

添加自定义路径到PATH环境变量

在环境变量PATH末尾添加自定义路径,路径之间用:分割,
  PATH=$PATH:/home/shiyanlou/mybin (一定要用绝对路径)
  这样就可以在任意目录执行那两个命令了(注意需要去掉前面的./),但这样我们一旦退出终端,再打开发现又失效了。有没有方法让添加的环境变量全局有效?或者每次启动 Shell 时自动执行上面添加自定义路径到 PATH 的命令?后一种方式的实现——让它自动执行。
  用户目录下有一个 Shell 每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等等,zsh 的配置文件是 .zshrc,相应 Bash 的配置文件为 .bashrc。它们在 etc 下还都有一个或多个全局的配置文件,不过我们一般只修改用户目录下的配置文件。
可以直接将内容添加到.zshrc中:
  echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
上述命令中>>表示将标准输出以追加的方式重定向到一个文件中,注意前面用到的 > 是以覆盖的方式重定向到一个文件中,在指定文件不存在的情况下都会创建新的文件。

修改已有变量

变量的修改方式:
在这里插入图片描述
  path=$PATH
  path=${path%/home/shiyanlou/mybin} //从尾向前删/home/shiyanlou/mybin
  或这可以使用通配符,*表示任意多个任意字符
  path=${path%*/mybin} //与上面效果一样

变量删除

  unset temp //删除一个环境变量

让环境变量立即将生效

  我们在 Shell 中修改了配置脚本文件之后(比如 zsh 的配置文件 home 目录下的 .zshrc),每次都要退出终端重新打开甚至重启主机之后其才能生效,很是麻烦,我们可以使用source 命令来让其立即生效,如:
  source .zshrc //要在当前文件目录下使用
  source命令还有一个别名就是.,上面的命令如果替换成.的方式就该是:
  . ./.zshrc

搜索文件

Linux中一切皆文件

  • whereis 简单快速
      whereis cat //搜索cat文件
      whereis搜索速度快,其直接在数据库中查询,但只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)

  • locate 快而全
      通过“ /var/lib/mlocate/mlocate.db ”数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行 updatedb命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次 updatedb命令。它可以用来查找指定目录下的不同文件类型,如查找/etc下所有以 sh 开头的文件:
      sudo apt-get update
      sudo apt-get install locate
      locate /bin/sh //它不只是在/bin 目录下查找,还会自动递归子目录进行查找。
      locate /usr/share/\*.jpg //查找 /usr/share/ 下所有 jpg 文件
      注意要添加 * 号前面的反斜杠转义,否则会无法找到。

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

  • find 精而细
      内容太多记不住。

小程序

黑客帝国电影里面的数字雨

    sudo apt-get update
    sudo apt-get install cmatrix
    Cmatrix  //即可显示

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值