王國慶 发表于 2025-11-5 09:21:35

【Linux】情况变量




本章讲的情况变量,操纵是基于Linux上的。
情况变量的根本概念

情况变量是操纵体系中用于生存设置信息的一种机制。它们在体系中充当全局变量,重要用于存储操纵体系和应用步伐运行时所需的告急参数和设置,提供了与体系交互和动态设置的途径。
情况变量的根本特点


[*]键值对情势:情况变量通常是一个键值对布局,比方 PATH=/usr/local/bin。键(比方 PATH)体现变量名称,值(比方 /usr/local/bin)体现变量内容。
[*]全局可访问性:情况变量在一个用户会话或进程情况中被全局访问,可以被全部步伐利用。
[*]动态设置:情况变量提供了一种在不修改代码的情况下调解步伐举动的方法,通过更改变量的值,可以影响步伐运行的方式。
情况变量的作用


[*]设置操纵体系和应用步伐:操纵体系和应用步伐依赖情况变量来决定它们的工作方式。比方,PATH 情况变量用于指定可实验文件的搜索路径。
[*]存储体系信息:情况变量用于存储体系的根本信息,比方主机名、用户名和用户主目次等。
[*]设置编译和运行情况:在软件开发和运行时,情况变量可以用于指定编译器路径、库路径等。
常见情况变量


[*]PATH:指定可实验步伐的搜索路径,当用户在终端输入下令时,体系会在此路径中查找对应步伐。
[*]HOME:用户的主目次路径。
[*]USER:当前用户名。
[*]SHELL:当前用户利用的 Shell 范例,如 Bash 或 Zsh。
[*]LANG:指定体系的语言和地区设置,用于国际化支持。
情况变量的管理
在 Linux 和 Unix 体系中,可以通过以下下令管理情况变量:
查察情况变量:利用 printenv 或 env。
查察单个情况变量:echo $NAME //NAME:情况变量名称
设置情况变量:利用 export 下令,比方 export VAR_NAME=value。
删除情况变量:利用 unset 下令,比方 unset VAR_NAME
表现当地界说的 shell 变量和情况变量: set


下令行参数的概念

C语言中的 main 函数实在也是有参数的:int argc 和 char *argv[],它们用于处理惩罚下令行参数,为步伐提供机动的输入方式。


[*]argc (Argument Count):参数计数,是一个整数,体现下令行转达给步伐的参数个数,包罗步伐名本身。
[*]argv (Argument Vector):参数向量,是一个字符串数组,包罗下令行转达的全部参数。argv 通常是步伐的名称,后续的 argv、argv 等是用户输入的其他参数。
举个例子:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMDAwNjViMGMwZjdjNDg4NzhiZDRlNmJkMDc1ZDk3NDYucG5n
输出效果:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvOTY4ZmE3OTY5Y2M2NDYyOWFmMzFmNTA2ZWYyZGM2ZGEucG5n
我们在下令行中输入的指令会被指令读取到argv维护的一段空间里,末端会主动加上一个NULL。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMjJiY2M3MDk2MTA2NDhhMWE2Y2NkNzIwMjQ1OTIyMzYucG5n
这两个参数是用来吸收下令行参数的,但在某些特定的编译器或操纵体系情况中,main 函数可以吸收一个非标准的第三个参数,通常是 char *envp[],用于访问情况变量。这种情势的 main 函数署名如下:
int main(int argc, char *argv[], char *envp[])
envp 的作用
envp (Environment Pointer):这是一个指向字符串数组的指针,此中每个字符串都是一个情况变量的键值对,格式为 KEY=VALUE。
情况变量提供了一些体系级的设置信息,比如用户主目次、体系路径等,这些信息可以被步伐读取和利用。
示例:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNzE2OTVmNmU3MGIxNDE0MDhlYmY5YzQyYTNmNTI1YzkucG5n
运行效果:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMTY0ZjE1ZDY1Mjg1NDNmNWEzNDBkNDQ2NWI2MWFkM2UucG5n
留意事项:


[*]并不是全部的体系或编译器都支持将 envp 作为 main 的第三个参数。利用这种情势时必要确保体系支持,或利用 POSIX 标准的 -getenv 函数来访问情况变量。
我们再通过 env 下令来查察一下在当前的bash中的情况变量:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMzc5NmY3OGNhODg1NGJiYTg3MTA0MzFiMGVjMTgxNjUucG5n
可以看到,我们写的步伐和 bash 的情况变量是一样的,这也阐明确情况变量是具有全局属性的,可以被子进程继续下去。

别的我们不但可用通过 main 函数的第三个参数来获取情况变量,也可以通过一个外部变量:environ 来获取情况变量


[*]界说: environ 通常被界说为一个指向字符指针数组的指针,即 char **environ 。这个数组中的每个元素都是一个以 \0 末端的字符串,每个字符串代表一个情况变量,其格式为 name=value ,此中 name 是情况变量的名称, value 是其对应的值。
[*]存储位置:情况变量由操纵体系维护,在步伐启动时,操纵体系会为步伐创建一个情况列表,并将其所在赋值给 environ ,如许步伐就可以通过 environ 来访问情况变量了。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZTVhM2ZmY2VjOTkwNDEwMmE4ZDRlNWFmM2MyZjZhYjgucG5n
运行效果:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYjJlYWRhYTdjYzQzNDc3YmE4ZjA4NDVlZWQ2NDUwNDcucG5n

除了上述两个方式可以获取情况变量之外,还可以通过C语言中的标准库函数,其函数原型为:
char *getenv(const char *name);


[*]功能: getenv 函数的重要功能是在步伐的情况变量列表中查找指定名称的情况变量,并返回其对应的值(如果存在)。如果指定的情况变量不存在,则返回 NULL 。
[*]参数阐明: getenv 函数继承一个 const char * 范例的参数 name ,这个参数就是要查找的情况变量的名称,比方,要查找 PATH 情况变量的值,就可以将 “PATH” 作为参数转达给 getenv 函数。
[*]返回值:如果找到匹配的情况变量, getenv 函数返回一个指向包罗该情况变量值的字符串的指针,这个指针指向的字符串是情况变量列表中的一部分,不应该被修改,由于这大概会粉碎步伐的运行情况。如果没有找到指定的情况变量,函数返回 NULL 。
示例:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMDVmYWRkNjhhNzE3NDExYjg5MjM2MmZjM2I1YmI5ZmEucG5n
输出效果:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvOWQxZTRiNGNlMDM5NGUzMGIwOWI4ODIxMzgxNDJhN2UucG5n
与 environ 的比力


[*]便利性: getenv 函数比直接利用 environ 更方便,特别是当只必要获取一个或几个特定情况变量的值时。利用 getenv 函数,不必要遍历整个情况变量列表,函数内部已经实现了查找机制。
[*]可移植性: getenv 函数是C标准库的一部分,在符合标准的C实现中都可以利用,具有良好的可移植性。而直接利用 environ 固然也能实现雷同的功能,但在代码风格和可移植性上大概稍逊一筹,由于 environ 的实现细节大概因操纵体系和编译器的差异而有所差异。
[*]范围性: getenv 函数仅实用于获取单个情况变量的值,如果必要对整个情况变量列表举行操纵,如打印全部情况变量或修改情况变量列表,照旧必要利用 environ 大概其他操纵体系提供的特定接口。


添加情况变量

在 Linux 中,添加情况变量有几种方法,详细取决于情况变量的见效范围(暂时会话、当前用户、全部效户)和加载方式。


[*]为当前会话暂时添加情况变量
在当前的终端会话中,可以直接利用 export 下令来添加情况变量。这种方法在关闭终端或注销后就会失效。
export VAR_NAME="value"

// 例如:
export PATH="$PATH:/my/custom/path"
这里必要留意:
在 PATH 这个情况变量中,每个路径是以 : 来举行分割的
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNjI2MGViMjRhMzRjNDcyYzgxMjA0MTUxY2IyZDVlN2QucG5n
以是,我们添加情况变量是令 PATH="$PATH:/my/custom/path",如许相称于是在原来的 PATH 后多加一个 /my/custom/path 路径,如果直接写成 PATH=/my/custom/path 大概会直接被覆盖。
但该修改仅在当前终端会话中有用。


[*]为当前用户永世添加情况变量
要使情况变量在每次登录时都见效,可以将其添加到用户主目次中的 ~/.bash_profile 或 ~/.bashrc 文件中:


[*]打开 ~/.bash_profile 或 ~/.bashrc 文件,在文件末端添加情况变量设置,比方:
export VAR_NAME="value"
export PATH="$PATH:/my/custom/path"
生存并关闭文件后,使情况变量立即见效:
source ~/.bash_profile
# 或
source ~/.bashrc

[*]为全部效户添加体系范围的情况变量
要为全部效户添加体系范围的情况变量,可以将情况变量添加到 /etc/profile 或 /etc/environment 文件中:


[*]/etc/profile:实用于全部效户的登录 shell。
在 /etc/profile 文件末端添加情况变量设置:
export VAR_NAME="value"
export PATH="$PATH:/my/custom/path"
生存并关闭后,新的会话或用户登录时将会加载该变量。


[*]/etc/environment:专门用于情况变量的文件,不必要利用 export 关键字,添加如下关键字:
VAR_NAME="value"
PATH="$PATH:/my/custom/path"
留意:/etc/environment 仅实用于情况变量,而不支持 shell 下令或复杂的路径操纵(如 “$PATH:/my/custom/path” 大概无法在此文件中精确分析)。
在 Linux 中,~/.bash_profile、~/.bashrc 和 /etc/bashrc 都是 Bash shell 的设置文件,但它们的作用和加载时机有所差异。以下是它们的重要区别:

[*] ~/.bash_profile

[*] 位置:用户主目次中的 ~/.bash_profile。
[*] 用途:设置用户的登录 shell 情况(包罗情况变量、路径、启动脚本等)。
[*] 加载时机:只在登录 shell 中加载(即当用户通过终端或 SSH 等方式登录体系时加载)。
[*] 内容:一样平常用于界说用户的全局情况变量和启动设置。在 .bash_profile 中,通常会调用 ~/.bashrc,以确保交互式非登录 shell 也加载相应的设置

[*] ~/.bashrc

[*]位置:用户主目次中的 ~/.bashrc。
[*]用途:设置交互式 shell 情况(别名、shell 函数、shell 选项等)。
[*]加载时机:每次启动交互式非登录 shell 时加载,比方通过终端窗口打开新 shell 或实验 Bash 时。
[*]内容:得当放置下令别名、shell 函数、PS1 提示符设置等,通常不直接界说情况变量(情况变量一样平常在 .bash_profile 中界说)。~/.bashrc 也会被 ~/.bash_profile 调用,以确保登录 shell 能共享到 ~/.bashrc 的设置。

[*] /etc/bashrc(或 /etc/bash.bashrc)

[*]位置:体系范围的 Bash 设置文件,通常在 /etc/bashrc 或 /etc/bash.bashrc。
[*]用途:为体系上全部效户提供默认的 shell 设置。
[*]加载时机:在每次启动交互式 shell 时加载,不管是登录还优劣登录 shell。通常由 ~/.bashrc 调用,因此每个用户都可以继续体系范围的设置。
[*]内容:得当界说体系范围的默认别名、shell 函数、PS1 提示符等。也可以根据必要对差异用户或情况设置差异的默认设置。

我演示一遍通过设置文件 ~/.bash_profile 来让我每次登录呆板时,会有一些欢迎语:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZDgwNmNjNWYxNDI0NDUxMTliN2FiMmE1MWFiM2MwYTIucG5n
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMjkwNzczZTVhOTQ0NDhmMTg4NzM3NTlkODFhMmZmZGIucG5n


bash 中的当地变量

在 Linux 和编程中,“当地变量”指的是只在特定的作用域内有用的变量。比方,它们只在当前 shell、当前函数、当前代码块中存在,脱离作用域后这些变量会被烧毁。
在 Bash Shell 中的当地变量
在 Bash 脚本中,当地变量仅在当前 shell 会话或当前函数内有用。要界说一个当地变量,可以简单地利用赋值语句。如果想要明确将变量限定为函数内当地,可以利用 local 关键字。
#!/bin/bash
VAR="I am a local variable"# 定义一个本地变量

echo $VAR# 输出本地变量的值
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZDllMDFkMDQyYjlhNGI5YjlhZTljOThlYjc4ZWY5ODkucG5n
在该脚本运行时,变量 hello 的作用范围仅限于该脚本的 shell 会话。运行完脚本后,hello 不再存在。
当地变量和情况变量在作用范围、继续特性、以及利用场景上有明显区别:

[*] 作用范围
当地变量:作用范围只在当前 shell、当前函数或当前代码块中。在 shell 会话中界说的当地变量只在当前 shell 进程中有用,退出后这些变量会被烧毁。

情况变量:可以在当前 shell 及其子进程中访问,具有更广的作用范围。情况变量会被当前 shell 继续到子进程中,因此可以在运行的步伐或脚本中被访问到。
[*] 界说方式
当地变量:直接赋值即可,比如 VAR=“value”。在 shell 函数中,可以通过 local 关键字来限定变量为函数级别的当地变量。

情况变量:通过 export 下令将变量标记为情况变量,比如 export VAR=“value”。如许 VAR 就会成为情况变量,而且在当前 shell 及其子进程中都可用。
[*] 继续性
当地变量:不能被子进程继续。纵然在父进程中界说了当地变量,子进程中也无法访问到。

情况变量:可以被子进程继续。只要将变量 export 成情况变量,任何从当前 shell 派生的子进程都能访问它。
[*] 利用场景
当地变量:实用于只在当前 shell 或函数中暂时利用的数据,不渴望其他 shell 会话或子进程受到影响。范例利用场景是在 shell 脚本中界说暂时变量,克制变量污染。

情况变量:实用于必要在整个体系中共享的信息,如 PATH、HOME、USER 等体系级设置信息,大概渴望某些设置转达给子进程利用。
我们可以写一段代码来演示一遍:
#!/bin/bash

VAR="local variable"   # 本地变量
export ENV_VAR="environment variable"# 环境变量

echo "In parent shell: VAR=$VAR, ENV_VAR=$ENV_VAR"

# 启动一个子进程,尝试访问变量
bash -c 'echo "In child shell: VAR=$VAR, ENV_VAR=$ENV_VAR"'
bash -c:bash 是一个下令,用于启动新的 Bash shell。-c 选项体现“下令模式”,即在新启动的 shell 中运行反面的下令字符串。这是要在子 shell 中实验的下令字符串。这个字符串中的 echo 下令用于输出 VAR 和 ENV_VAR 变量的值。
运行这段脚本文件的步调如下:
生存脚本:将脚本内容生存到一个文件中,比方 test.sh。
赋予实验权限:使脚本具有实验权限。可以在终端中利用 chmod 下令赋予文件实验权限:
chmod +x test.sh
运行脚本:在终端中实验脚本,可以利用以下下令:
./test.sh
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZGVkZmZjZjE1ZjVkNDIyNDlmNGUzYjk4M2YwODhjZDAucG5n
第一行输出来自父进程,它能访问 VAR 和 ENV_VAR。
第二行输出来自子进程。由于 VAR 是父进程的当地变量,无法转到达子进程,以是表现为空。而 ENV_VAR 是情况变量,可以被子进程继续并输出其值。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【Linux】情况变量