Linux中环境变量与文件查找
一、环境变量
- 1.变量
- 变量,准确的说应该是shell变量,所谓变量就是计算机中用于记录一个值(不一定是数值,也可以是字符或字符串)的符号,而这些符号将用于不同的运算处理中。通常变量与值的一一对应的关系,可以通过表达式读取它的值赋值给其他变量,也可以直接指定数值赋值给任意变量。为了便于运算和处理,大部分的编程语言会区分变量的类型,用于分别记录数值、字符或者字符串等数据类型。shell中的变量也是基本如此,有不同的类型(但不用专门指定类型名),可以参与运算,有作用域限定。
可以使用declare命令创建一个名为temp的变量
declare temp
使用=进行赋值操作
temp = cdl
读取变量的值,使用echo命令和符号用于表示引用一个变量的值)
echo $temp - 2.环境变量
- 环境变量就是作用域比自定义变量要大,如shell的环境变量作用于自身和它的子进程。在所有的UNIX和类UNIX系统中,每个进程都有其各自的环境变量设置。关于环境变量,可以简单的理解为在当前进程的子进程是否有效,有效则为环境变量,否则不是。
- 3.命令的查找路径与顺序
- 在shell中输入一个命令,shell是怎么知道在哪去找到这个命令然后执行的呢?这是通过环境变量PATH来进行搜索的,熟悉windows的用户可能知道Windows中也有一个PATH的环境变量,这个环境变量中就保存了shell中执行的命令的搜索路径。
查看PATH环境变量的内容:
echo $PATH - 通过这一类目录下放的都是可执行文件,当我们在shell中执行一个命令时,系统就会按照PATH中设定的路径按照顺序依次到目录中去查找,如果存在同名的指令,则执行先找到的那个。
创建一个shell脚本文件:
vim hello_shell.sh
在脚本文件中添加下面的内容:
- 在shell中输入一个命令,shell是怎么知道在哪去找到这个命令然后执行的呢?这是通过环境变量PATH来进行搜索的,熟悉windows的用户可能知道Windows中也有一个PATH的环境变量,这个环境变量中就保存了shell中执行的命令的搜索路径。
- 变量,准确的说应该是shell变量,所谓变量就是计算机中用于记录一个值(不一定是数值,也可以是字符或字符串)的符号,而这些符号将用于不同的运算处理中。通常变量与值的一一对应的关系,可以通过表达式读取它的值赋值给其他变量,也可以直接指定数值赋值给任意变量。为了便于运算和处理,大部分的编程语言会区分变量的类型,用于分别记录数值、字符或者字符串等数据类型。shell中的变量也是基本如此,有不同的类型(但不用专门指定类型名),可以参与运算,有作用域限定。
#! /bin/bash
for((i=0;i<10;i++)); do
echo "hello shell"
done
exit 0
为文件添加执行权限:
chmod 755 hello_shell.sh
执行脚本:
./hello_shell.sh
创建一个C语言程序:
vim hello_world.c
添加C文件:
#include <stdio.h>
int main(void){
printf("hello word!\n");
return 0;
}
使用gcc生成可执行文件:
gcc -o hello_world hello_world.c
gcc生成二进制文件默认具有可执行权限,无需修改。在cdl目录中创建mybin目录,将上述文件移动到其中:
mkdir mybin
mv hello_shell.sh hello_world mybin/
此时,可在mybin目录下运行刚刚创建的程序:
cd mybin
./hello_shell.sh
./hello_world
- 4.添加自定义路径到"PATH"环境变量
- 要在其他目录仍然运行创建的程序,需要添加自定义路径到PATH环境变量。PATH里面的路径以:作为分隔符,所以这样添加自定义的路径: PATH=$PATH:/home/cdl/mybin,此时可在其他目录执行创建的程序。cd ~ hello_shell.sh hello_world
- 然而,上面的设置方法并没有彻底解决问题,因为PATH环境追加了一个路径,它只是在当前shell有效,一旦退出终端,再打开就会发现又失效了。可以每次启动shell时自动执行上面添加自定义路径到PATH的命令来解决这个问题。
- 在每个用户的home目录中有一个shell每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等。zsh的配置文件是.zshrc,相应的Bash的配置脚本为.bashrc。它们在etc下还都有一个或多个全局的配置文件,不过一般只修改用户目录下的配置文件。可以简单的使用下面的指令直接添加内容到.bashrc中:
echo “PATH=$PATH:/home/cdl/mybin” >> .bashrc - 上面的命令中>>表示将标准输出以追加的方式重定向到一个文件中,注意前面用到的>表示是以覆盖的方式重定向到一个文件中,使用的时候一定要注意!在指定文件不存在的情况下,都会创建新的文件。
- 5.删除已有的变量
可以使用unset命令删除一个环境变量
unset tmp - 6.如何让环境变量立即生效
- 在上面我们在shell中修改了一个配置脚本之后(比如bash的配置文件home目录下的.bashrc),每次都要退出终端重新打开甚至重启主机之后其才能生效,很麻烦。可以使用source命令来让其立即生效,如:source .bashrc。source命令还有一个别名就是.,注意这与当前路径的那个点区分开,虽然形式一样,但作用与使用方式不一样,上面的命令如果替换成.的方式就是 . ./.bashrc
二、搜索文件(与搜索文件相关的命令常用的有whereis which find locate)
- 1.whereis简单快速
- 这个搜索很快,因为它并没有从硬盘中依次查找,而是直接从数据库中查询。whereis只能搜索二进制文件(-b),man帮助文件(-m)和源代码文件(-s)。如果想要直接获得更全面的搜索结果可以使用locate命令。whereis -m docker 查看docker帮助文件的地址
- 2.locate快而全
- 通过"/var/lib/mlocate/mlocate.db"数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行updatedb命令更新一次,所以有时候添加的文件,它可能会找不到,需要手动执行一次updatedb命令。如果想只统计数目可以加上参数-c,-i参数可以忽略大小写进行查找,whereis的-b -m -s同样可以使用。locate docker 查询和docker有关的文件
- 3.which小而精
- which本身是shell内建的一个命令,通常用which来确定是否安装了某个指定的软件,因为它只从PATH环境变量指定的路径中去搜索命令。which docker 查看docker是否安装
- 4.find精而细
- find应该是这几个命令中最强大的了,它不但可以通过文件类型,文件名进行查找而且可以根据文件的属性(如文件的时间戳、文件的权限)进行搜索。与时间相关的命令参数:
列出home目录中,当天(24小时内)有改动的文件:
find ~ -mtime 0
列出用户home目录下比code文件夹新的文件:
find ~ -newer /home/cdl/code
- find应该是这几个命令中最强大的了,它不但可以通过文件类型,文件名进行查找而且可以根据文件的属性(如文件的时间戳、文件的权限)进行搜索。与时间相关的命令参数: