1. 什么是环境变量?
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
2. 为什么会有环境变量?
在Linux系统中,我们发现我们在执行一些指令时,比如ll等指令,直接就可以输入ll指令获得结果,而对于我们自己编译的程序,比如make之后的文件,就需要./文件才能执行。对于执行一个命令来说,我们知道,命令事实上也是一种文件,对于执行这个文件,我们就需要先找到这个文件,在将这个文件执行。而对于ll来说,其对应的文件事实上已经是Linux系统分配到全局的,也就是在默认路径(根目录),因此不需要指定路径搜索这个指令对应的文件,直接ll就代表从根目录查找从而执行。而对于make生成的程序,我们知道这个可执行程序是在当前路径下,并不在根目录中,因此我们也就无法直接输入文件名从而执行,而是需要找到这个文件对应的路径再去执行,因此./就代表着当前路径,而./此文件就代表找到这个文件的路径并且去执行它!
command not found就意味着并没有从根目录找到这个命令对应的文件。
经过上面的描述,我们知道,如果我们将可执行程序也复制到根目录,那么就也可以直接输入文件名就可以执行该程序了
但是这么做是不好的,因为我们在根目录下拷贝就相当于下载了一个文件,这样不经过测试的指令程序事实上会污染系统的指令池的,因此为了改善这种方式,就有了环境变量的方式去处理这种问题!
Linux env 命令是用于显示和定义环境变量的一个工具。环境变量是一些存储在系统中的特殊变量,它们可以影响系统的行为和用户的工作环境。例如,PATH 环境变量指定了系统在执行命令时要搜索的目录列表,LANG 环境变量指定了系统使用的语言和字符编码等。
使用 env 命令,你可以查看当前系统中已存在的环境变量,也可以在指定的环境中执行其他命令。env 命令有以下常用的参数:
- -i:创建一个新的空白环境,不继承当前的环境变量。
- -u:从当前环境中删除指定的变量。
- –help:显示帮助信息。
- –version:显示版本信息。
以下是一些 env 命令的使用示例:
显示当前系统的全部环境变量信息:
env
删除当前系统中的指定环境变量,例如 LOGNAME:
env -u LOGNAME
定义当前系统中的指定环境变量值,例如 PWD:
env PWD=/Dir
在一个修改后的环境下执行命令,例如在 PATH 中添加一个新的目录并执行 perl 命令:
env PATH=$PATH:/new/dir perl --version
为什么能够在系统中找到对应的指令呢?事实上系统中存在一个环境变量PATH,它能够去检索对应的指令,找到了就会去执行,找不到就会像上面一样提示not found,因此我们如果想用另一种方式去直接执行文件,就可以将这个文件路径添加到环境变量PATH中。
当我们查看PATH变量时,每一个:所间隔的就是一个检索的路径,因此只要把想直接执行的文件的路径也添加到这个里面,就能够检索到从而执行。
Linux export 命令是用于设置或显示环境变量的一个常用命令。环境变量是一些在 shell 中执行程序时,shell 会提供给程序的一组变量。环境变量可以影响程序的运行行为,例如 PATH 环境变量可以指定程序的搜索路径,LANG 环境变量可以指定程序的语言设置等。使用 export 命令,你可以新增,修改或删除环境变量,供后续执行的程序使用。export 的效力仅限于该次登录操作,如果你想永久地修改环境变量,你需要修改相关的配置文件,例如 ~/.bashrc 或 /etc/profile 等。
export 命令的基本语法是:
export [选项] [变量名]=[变量值]
其中,选项可以是以下之一:
-f
代表变量名中为函数名称。-n
删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。-p
列出所有的 shell 赋予程序的环境变量。如果没有指定选项和参数,export 命令会列出当前所有的环境变量及其值。
例如,如果你想设置一个名为 MYENV 的环境变量,值为 7,你可以输入:
export MYENV=7
如果你想查看当前所有的环境变量,你可以输入:
export -p
如果你想删除一个名为 MYENV 的环境变量,你可以输入:
export -n MYENV
注:对于export定义的本地变量,实际上是字符串类型,并且可以加双引号,也可以不加双引号,但是对于字符串来说,建议加上双引号,因为字符串可能会有空格这种字符。
Linux source 命令是一个用于在当前 shell 环境中读取和执行文件中的命令的内置命令。source 命令通常用于保留或更改当前 shell 中的环境变量,例如刷新配置文件,导入函数,或者执行脚本。source 命令的基本语法是:
source 文件名 [参数]
或者
. 文件名 [参数]
其中,
.
是 source 命令的另一种写法,作用相同。文件名是要执行的文件的路径,参数是要传递给文件中的命令的参数。如果不指定文件名和参数,source 命令会列出当前 shell 的环境变量。source 命令有以下几种常见的用法:
- 刷新当前 shell 环境。如果在当前 shell 中修改了一些环境变量,例如别名,路径,语言等,可以使用 source 命令重新加载配置文件,使修改立即生效,而不需要注销或重启。例如,如果修改了 ~/.bashrc 文件中的别名,可以使用
source ~/.bashrc
或. ~/.bashrc
来刷新当前 shell 环境。- 在当前环境下执行 shell 脚本。如果在一个 shell 脚本中使用了一些在当前 shell 中定义的变量,可以使用 source 命令在当前 shell 中执行该脚本,而不是启动一个新的子 shell。这样可以保证脚本中的变量能够被正确识别和使用。例如,如果在一个脚本 test.sh 中使用了一个在当前 shell 中定义的变量 website,可以使用
source test.sh
或. test.sh
来执行该脚本。- 从脚本中导入 shell 函数到当前环境。如果在一个脚本中定义了一个或多个 shell 函数,并且想在当前 shell 中使用这些函数,可以使用 source 命令将这些函数导入到当前环境中。这样就可以在当前 shell 中直接调用这些函数,而不需要每次都运行脚本。例如,如果在一个脚本 func.sh 中定义了一个函数 foo,可以使用
source func.sh
或. func.sh
来导入该函数到当前环境中,并且可以直接使用foo
来调用该函数。
通过指令 :export PATH=$PATH:/home/cfy/sbl/lesson13
就可以将这个指令追加到PATH环境变量中。
- HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
- HOSTNAME:主机名
- USER:当前用户名
- PWD:当前系统路径
- HISTSIZE:shell 能记忆的最多历史命令的条数
- uname:
uname命令是一个Linux/Unix命令,用于显示操作系统的信息。它的语法如下:
```
uname [options]
```常用的选项包括:
- `-a`:显示所有信息(默认选项)
- `-s`:显示操作系统的名称
- `-n`:显示主机名
- `-r`:显示内核版本号
- `-v`:显示操作系统的版本号
- `-m`:显示机器类型
- `-p`:显示处理器类型例如,运行`uname -a`命令会显示所有信息,包括操作系统名称、主机名、内核版本号、操作系统版本号、机器类型和处理器类型。
- Linux id命令是一个用于显示用户的ID,以及所属群组的ID的shell内建指令,它可以显示用户的UID(User ID)、GID(Group ID)以及附属于用户的所有组 ID
- Linux id命令的基本语法是:
id [选项] [用户名称]
其中,[用户名称]是指定要显示的用户的名称,如果不指定,则默认为当前用户。[选项]是用来控制id命令的行为的参数,例如:
-g
或--group
:显示用户所属群组的ID。
-G
或--groups
:显示用户所属附加群组的ID。
-n
或--name
:显示用户,所属群组或附加群组的名称。
-r
或--real
:显示实际ID。
-u
或--user
:显示用户ID。
Linux set命令是一个非常强大的命令,它可以让你控制shell的行为和环境。Linux set命令有两种用法,一种是不带任何参数,另一种是带有一个或多个参数。下面我将分别介绍这两种用法。
- 不带任何参数的set命令:当你在shell中输入set命令后,它会显示当前shell的所有变量和函数,包括系统变量、用户变量和自定义函数。这些变量和函数的值可以用来配置shell的环境或者在脚本中使用。例如,你可以输入
set | grep PATH
来查看当前shell的PATH变量的值,或者输入set | grep hello
来查看是否定义了名为hello的函数。- 带有一个或多个参数的set命令:当你在shell中输入set命令后,加上一个或多个参数,它会根据这些参数来改变shell的执行方式。这些参数可以分为两类,一类是以
-
开头的选项,另一类是以+
开头的选项。以-
开头的选项表示启用某种功能,以+
开头的选项表示禁用某种功能。例如,你可以输入set -e
来启用错误检测功能,或者输入set +e
来禁用错误检测功能。
注意,我们所创建的本地变量(局部变量)不能被env找到,但是却可以被set找到,这也就说明了set能够找到shell本地的变量和环境变量,也就是局部变量和全局变量。
而对于set本身,因为里面既有环境变量又有本地变量,因此其内容远多于env,对于类似于续行符 \这样的符号,其内部也存在。
- Linux unset命令是一个用于删除变量或函数的shell内建指令,它可以清除已定义的shell变量(包括环境变量)和shell函数,释放它们占用的内存空间
- Linux unset命令的基本语法是:
unset [-fv] [变量或函数名称]
其中,[变量或函数名称]是指定要删除的变量或函数的名称,可以是一个或多个。[-fv]是用来控制unset命令的行为的参数,例如:
-f
:仅删除函数。
-v
:仅删除变量。Linux unset命令的使用示例如下:
- 删除环境变量mylove及其对应的值,输入如下命令:
unset -v mylove
- 删除函数myfunc及其定义,输入如下命令:
unset -f myfunc
- 同时删除变量myvar和函数myfunc,输入如下命令:
unset myvar myfunc
我们拿ls 指令举例:
我们发现,ls 后的指令为什么不需要./
,而是直接输入文件名就行了呢?也就是为什么ls就知道这个文件的当前路径在哪里呢?
实际上,这是因为我们有一个环境变量PWD,通过PWD就能够找到对应的路径:
我们发现,当我们cd ..
到什么路径,PWD就会变成什么路径。因此,ls 就是通过这个环境变量找到了这个文件。
既然环境变量中有PWD,那我们也可以自己实现PWD指令:
因此,环境变量的意义就在于其可以找到指定文件的路径。环境变量就相当于系统启动时加载到内部的全局变量。