Linux下的环境变量【详解】

Linux下的环境变量

  • 一,环境变量的概念
  • [1 概述](#1 概述)
  • [2 环境变量的分类](#2 环境变量的分类)
  • [3 常见的环境变量](#3 常见的环境变量)
  • [4 查看环境变量](#4 查看环境变量)
    • [4.1 shell变量](#4.1 shell变量)
    • [4.2 查看环境变量](#4.2 查看环境变量)
  • [5 添加和删除环境变量](#5 添加和删除环境变量)
    • [5.1 添加环境变量](#5.1 添加环境变量)
    • [5.2 删除环境变量](#5.2 删除环境变量)
  • [6. 通过代码如何获取环境变量](#6. 通过代码如何获取环境变量)
    • [6.1 命令行的第三个参数](#6.1 命令行的第三个参数)
    • [6.2 通过第三方变量environ获取](#6.2 通过第三方变量environ获取)
    • [6.3 通过getenv获取](#6.3 通过getenv获取)
  • [7. 环境变量的全局性](#7. 环境变量的全局性)

一,环境变量的概念

1 概述

环境变量一般指的是在操作系统中用于指定操作系统运行环境的一些参数。

在链接C/C++程序的代码时,会用到动静态库,但是动静态库我们并没有显示的去指定过让系统去那个路径下寻找它,但是每次都可以链接成功,这是因为有了环境变量的帮助。

环境变量还会有一些特殊的用途,比如可以用作身份验证。

2 环境变量的分类

  • 按照生命周期来分,Linux环境变量可以分为两类:

    1. 永久的:需要用户修改相关的配置文件,变量永久生效
    2. 临时的:用户利用export命令,在当前终端下声明环境变量,关闭Shell终端失效。
  • 按照作用域来分,Linux环境变量可以分为:

    1. 系统环境变量:系统环境变量对该系统中所有用户都有效。
    2. 用户环境变量:顾名思义,这种类型的环境变量只对特定的用户有效。

3 常见的环境变量

  • PATH:决定了 shell 将到哪些目录中寻找命令或程序
  • HOME:当前用户主目录(就是用户登录linux系统中时,默认的目录
  • USER:当前用户的用户名。
  • HISTSIZE:历史记录数
  • LOGNAME:当前用户的登录名
  • HOSTNAME:指主机的名称
  • SHELL:当前用户 Shell 类型,它的通常值是/bin/bash
  • LANGUGE:语言相关的环境变量,多语言可以修改此环境变量
  • MAIL:当前用户的邮件存放目录
  • PS1:基本提示符,对于 root 用户是 #,对于普通用户是 $

Linux 系统中环境变量的名称一般都是大写的,这是一种约定俗成的规范。

4 查看环境变量

4.1 shell变量

echo的作用是用于字符串的输出.

运行shell时,会同时存在三种变量:

1) 局部变量: 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量: 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell变量: shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

变量在shell中是这样被定义的name = "tanghuan",定义变量时,变量名不加美元符号$.

变量的命名规则如下:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线 _。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

那后面的字符串的双引号是必须的吗?答案是否定的。
字符串可以用单引号,也可以用双引号,也可以不用引号。

  • 单引号字符串的限制:
    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

${NAME} $后面带上一个花括号可以帮助确定变量范围,是良好的编码习惯。

  • 双引号的优点:
    • 双引号里可以有变量
    • 双引号里可以出现转义字符

4.2 查看环境变量

echo $NAME//NAME是环境变量的名称

输入:echo $PATH

会输出这样一串字符:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

他们以 : 作为分隔符,将其分隔成一些子路径,当写入命令时,会自动一个子路径一个子路径的寻找命令自己的源文件,所以就不需要像我们自己写的文件那样,需要主动加上路径(./project),才能被系统所识别运行。

5 添加和删除环境变量

5.1 添加环境变量

环境变量也是变量,跟shell变量的操作一样,不过PATH=(需要添加的环境变量)这么写可就错了,这样会覆盖掉原来的环境变量,所以得:PATH=$PATH:(需要添加的环境变量).

需要注意的是,上面那样添加的环境变量在子进程及其后代进程不会产生影响,且只对本次登录有效,具有临时性。要是想对子进程及其后代进程也有效,需要引入export,

需要这样写:export PATH=$PATH:(需要添加的进程)

要是不小心像前者那么写并运行了也不用担心,更改的环境变量只限于本次登录,重新登录后。环境变量又会自动恢复成原来的默认路径了。

原因是前面提到的环境变量的分类可以分为永久性和临时性,在当前终端下声明环境变量,是临时性的。要是想永久性的修改环境变量,需要对配置文件进行操作。

  1. cd ~
  2. vim ./bash_profile
  3. export PATH=$PATH:(需要添加的进程)
  4. 即可永久性的添加环境变量。

5.2 删除环境变量

删除永久性的环境变量需要进入到配置文件中删除相应的命令。

删除临时性的环境变量需要使用到unset (环境变量名称)命令,如unset PATH

此时会清除所有的命令,若是只想清除部分路径,可以使用添加环境变量的方法进行修改

比如:PATH=(需要保留的路径):(需要删除的路径)可以:PATH=$(需要保留的路径).

6. 通过代码如何获取环境变量

6.1 命令行的第三个参数

命令行的第三个参数就是环境变量数组char* env[]

c 复制代码
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{
int i = 0;
for(; env[i]; i++){
printf("%s\n", env[i]);
}
return 0;
}

6.2 通过第三方变量environ获取

c 复制代码
#include <stdio.h>
int main(int argc, char *argv[])
{
extern char **environ;
int i = 0;
for(; environ[i]; i++){
printf("%s\n", environ[i]);
}
return 0;
}

·

6.3 通过getenv获取

c 复制代码
#include <stdlib.h>
int main()
{
	char* p = getenv("PATH");
	printf("%s\n",p);
	return 0;
}

7. 环境变量的全局性

环境变量通常具有全局属性,可以被子进程继承下去。

因为创建子进程时,是以父进程为模板或者父进程创建的,进程的环境变量信息可以通过子进程及其后代进程继承。

c 复制代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
	printf("初始PATH的值:%s\n", getenv("PATH"));
	putenv("PATH=/usr/local/sbin");
    printf("修改后PATH的值:%s\n", getenv("PATH"));
    int flag = fork();
    if(flag == 0)
    {
    	 //子进程
    	printf("子进程的PATH:%s\n", getenv("PATH"));                                                                                          
 
    }
    return 0;
}

运行结果为:


😄 创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看😄

相关推荐
daqinzl2 分钟前
java获取机器ip、mac
java·mac·ip
AndyFrank4 分钟前
mac crontab 不能使用问题简记
linux·运维·macos
激流丶17 分钟前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
筱源源20 分钟前
Kafka-linux环境部署
linux·kafka
Themberfue21 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
EricWang135832 分钟前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
我是谁??34 分钟前
C/C++使用AddressSanitizer检测内存错误
c语言·c++
让学习成为一种生活方式38 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画43 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
成都古河云1 小时前
智慧场馆:安全、节能与智能化管理的未来
大数据·运维·人工智能·安全·智慧城市