文章目录
一、环境变量
1.1 基本概念
环境变量我们早已听说过,比如在学习 JAVA 或者 Python 的时候,会在 windows 上配置环境变量:
可环境变量到底是什么呢?
-
环境变量 (environment variables) 一般是指在操作系统中用来指定操作系统运行环境的一些参数。
这些参数通常有特殊的用途。
-
比如:我们在编写 C/C++ 代码的时候,在链接的时候,我们从来不知道我们所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
-
环境变量通常具有某些特殊用途,环境变量在系统当中通常具有全局特性。
常见环境变量:
-
PATH:(当前用户)指定命令的搜索路径。
-
HOME:指定当前用户的主工作目录(即用户登陆到 Linux 系统中时,默认的目录)。
-
SHELL:当前 shell,即当前用户使用的命令行解释器的版本,它的值通常是 /bin/bash。
-
HISTSIZE:命令历史记录保存数量。(centos 6.7 默认是 3000 条)
命令 history 可以查看所有命令历史记录。搭配管道
history | wc -l
可以查看命令历史记录的行数。
1.2 查看环境变量
-
echo $PATH
命令,PATH 是环境变量的名称,查看指定环境变量。 -
env 命令,查看系统中所有的环境变量。
1.3 环境变量:PATH
思考:
-
我们编写的 C/C++ 代码,编译生成的可执行程序,是不是一个命令呢?—— 是的。
-
在 Linux 中,任何一个可执行程序,具有可执行权限(x),就称之为它是一条命令。
其实我们听过的:程序、命令、指令、可执行程序等等,其实都是一个概念,是同一个东西。(⭐)
思考:
-
既然是同一个概念,那为什么我们运行
ls
等命令,不用带./
当前路径,而运行我们自己的可执行程序proc
必须要带./proc
当前路径呢?
分析:
-
环境变量 PATH 中保存的是指定命令的搜索路径。
-
因为
ls
等命令是在系统的特定路径下保存起来的。 -
而我们的
proc
命令没有保存在 PATH 指定的这些路径中,而系统执行命令只会在 PATH 指定的这些路径中搜索,所以系统找不到我们的proc
命令,就报错了。
思考:
那有没有什么办法,可以让可执行程序 proc
不用带 ./
当前路径就可以直接运行呢?
-
方法1:把
proc
拷贝到环境变量 PATH 指定的任一路径下。 -
方法2:把
proc
所在路径添加到环境变量 PATH 中。(注意:我们自己添加的环境变量,系统重启后不会被保存)$ PATH=$PATH:/home/ll/xxx/10 # :冒号是分隔符 # 注意:PATH=/home/ll/xxx/10,不能这样写,必须加上$符号,否则会把PATH中所有内容覆盖掉
运行效果图:
注意:
如果我们不幸把环境变量给覆盖掉了,不用担心,环境变量既然是变量,说明它是可以被赋值的,即在用户登录的时候,通过用户目录下的配置文件赋值的,所以只需要重新登录下就好了。
比如:家目录下的 .bash_profile 文件,这些文件不建议自己去随意修改:
1.4 环境变量:HOME
分别在 root 和普通用户下执行 cd ~ 和 pwd 查看家目录,分别是 /root
和 /home/ll
,为什么不一样呢?
是因为不同用户的家目录中的配置文件不一样,所以不同用户下的环境变量 HOME 也是不一样的:
[ll@VM-0-12-centos ~]$ echo $HOME # 指定用户的主工作目录
/home/ll
[root@VM-0-12-centos ~]$ echo $HOME
/root
1.5 和环境变量相关的命令
- echo:显示某个环境变量值。
- export:设置一个新的环境变量。
- env:显示所有环境变量。
- set:显示在本地 shell 内定义的变量和环境变量。(既能查看本地变量,也可以查看环境变量)
- unset:清除环境变量。
1.6 通过 C 库函数获取环境变量:getenv
getenv 和 setenv 函数介绍:
#include <stdlib.h>
/*
* name: 环境变量的名称
* 返回值: 环境变量的内容
*/
char *getenv(const char *name); // 获取环境变量
int setenv(const char *name, const char *value, int overwrite); // 更改或添加环境变量
👉 getenv 使用举例:
/*