Linux环境变量(添加环境变量、修改系统环境变量、内建命令和非内建命令)

Linux环境变量(添加环境变量、修改系统环境变量、内建命令和非内建命令)

1. 环境变量的介绍

环境变量 (environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。

例如Linux中的 PATH 环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到 PATH 中指定的路径去找。在Linux中,有很多的环境变量,它们以全大写的形式作为名称。

bash 复制代码
env		#查看所有环境变量

环境变量包括:

HOME 当前用户家目录的环境变量

PWD 记录当前位置的,一种变化的环境变量

HISTSIZE 记录用户最近1000条命令的环境变量( history 命令可以查看这1000条命令)

PATH 用于指定可执行程序的搜索路径,系统会按照PATH环境变量中指定的路径顺序搜索可执行文件,直到找到匹配的可执行文件或搜索完所有路径。

2. 添加环境变量

环境变量可以分为内存级环境变量和文件级环境变量,区别在于从磁盘中加载到内存中的环境变量称为内存级环境变量 ,内存级环境变量的特点是每次重新开机都会刷新,对内存级的环境变量进行更改无法永久保留 。而文件级环境变量则是直接对环境变量的配置文件内容进行修改 ,这样每次开机系统都会将修改的文件加载进内存,添加的文件级环境变量也就能永久保存

2.1 添加内存级环境变量

export 命令可以在当前 shell 会话中设置环境变量。注意这个设置只会影响当前会话和由此启动的子进程

bash 复制代码
exprot [env_varable]="[value]"

2.2 添加文件级环境变量

在每个用户的家目录下,都会有两个以.开头的隐藏文件,.bash_profile.bashrc

.bash_profile 会判断 .bashrc 文件是否存在。如果存在,就把 .bashrc 的里内容加载到 bash 里。

.bashrc 会判断系统的 bashrcetc/bashrc)是否存在。如果存在,就把系统的bashrc 的里内容加载到 bash 里。

而系统的 bashrc 存储着所有的系统环境变量。

想要添加一个文件级环境变量,只需要在 .bash_profile 文件中追加一行自己的文件变量即可,命令用法相同:

bash 复制代码
exprot [env_varable]="[value]"

2.3 取消自己的环境变量

bash 复制代码
unset [环境变量名]

自己创建的环境变量由于是内存级的环境变量,不会储存到配置文件中。

3. 修改系统环境变量

以 PATH 环境变量为例,修改系统环境变量的命令的用法和添加环境变量的命令基本相同,本质思想是在已有的环境变量后面追加自己的环境变量参数。

PATH 环境变量是在开机的时候加载到内存的,所以即使被更改,在下一次开机时也会被重置。PATH 是一种内存级的环境变量。

3.1 放到PATH已保存的路径下

查看当前 PATH 环境变量的内容:

复制代码
echo $PATH

将自己写的程序放到环境变量的目录下,那么不需要路径直接输入程序的名字就可以运行。

3.2 加PATH的路径

PATH= 命令将环境变量改成程序的当前目录,不需要路径也可以运行程序。

bash 复制代码
PATH="[dir]"

但要注意**PATH= 命令是覆盖当前环境变量的路径**,想要保留系统的 PATH 路径的基础上,再追加自己的路径,得这样使用:

bash 复制代码
PATH="$PATH:[需要添加的路径]"

注意写绝对路径。

which 命令的搜索,实际就是在环境变量中搜索的。将自己写的程序路径添加到环境变量当中,就可以用which命令搜索自己的程序

3.3 在PATH的配置文件中添加

PATH 是内存级的环境变量,每次开机,自己添加的环境变量都会失效。想要添加文件级的 PATH 环境变量,还是需要在 .bash_profile 文件后面追加内容:

4. main函数与环境变量

main() 可以传参,定制进程的不同选项。那么系统的进程是如何维护自己的进程的选项的呢?

系统的进程的代码中没有直接把一大堆的环境变量直接写进 argv[] 数组里,而是使用了一个外部声明 extern char **environ

environ 是一个指向环境变量的指针数组。它指向了 char* argv[] ,所以系统只需要调用这个指针就能对访问所有的环境变量了。

c 复制代码
#include <stdio.h>

extern char **environ;

int main() {
    char **env = environ;
    while (*env != NULL) {
        printf("%s\n", *env);
        env++;
    }
    return 0;
}

5. 本地变量

环境变量是在整个操作系统环境中可用的变量,它们不仅可以在当前 shell 会话中使用,还可以传递给任何由当前 shell 启动的子进程。

本地变量(Local Variables)是在 shell 会话或 shell 脚本中定义的变量,其作用域仅限于当前 shell 会话或脚本。变量是临时性的,它们在shell会话结束或脚本执行完毕后会被销毁。

添加本地变量

bash 复制代码
[变量名]=[变量路径]

直接在命令行创建的变量是本地变量,本地变量只在本bash内部有效,无法被子进程继承。将本地变量导成环境变量,才能被获取。

但有一部分内建命令,由bash亲自执行,不创建子进程。这些命令可以获取本地变量

6. bash和它的子进程

bash进程在启动的时候,默认会给子进程形成两张表:

argv[] 命令行参数表,env[] 环境变量表。

argv[]是用户输入命令行,argv[0]中一般是执行的命令或脚本的名称,argv[1]argv[2]等依次是传递给命令或脚本的参数。例如:用户输入ll -a指令,argv[0]中就是llargv[1]中就是 -a

env[] 是从OS的配置文件加载的,它是一个环境变量表,用于存储操作系统环境中的各种环境变量。

7. 内建命令和非内建命令

bash一般会把命令交给子进程来完成,由子进程完成的命令被称为非内建命令 (又称外部命令),80% 的命令都是 bash 的子进程。pwdll 等命令都是非内建命令。

一部分特殊的命令必须由bash亲自完成,这类命令被称为内建命令 (又称内部命令),exportecho 等命令都是内建命令,由 bash 亲自执行,不创建子进程。

相关推荐
超喜欢下雨天2 分钟前
服务器安装 ros2时遇到底层库依赖冲突的问题
linux·运维·服务器·ros2
搬码临时工8 分钟前
小企业如何搭建本地私有云服务器,并设置内部网络地址提供互联网访问
运维·服务器
tan77º43 分钟前
【Linux网络编程】网络基础
linux·服务器·网络
18你磊哥1 小时前
Windows 本地安装部署 Apache Druid
运维·debian
笑衬人心。1 小时前
Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南
linux·mysql·ubuntu
IT成长日记2 小时前
【Docker基础】Docker数据卷管理:docker volume inspect及其参数详解
运维·docker·容器·volume·inspect
ldj20202 小时前
Jenkins 构建过程常见错误
运维·jenkins
ladymorgana2 小时前
【Docker】如何设置 `wiredTigerCacheSizeGB` 和 `resources.limits.memory`
运维·docker·容器
代码讲故事3 小时前
多种方法实现golang中实现对http的响应内容生成图片
开发语言·chrome·http·golang·图片·快照·截图
chanalbert3 小时前
CentOS系统新手指导手册
linux·运维·centos