Linux中常见环境变量的特点与设置指南
前言
环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息。理解环境变量对于系统管理、软件开发都很重要。
一、环境变量的概念
环境变量是操作系统用来存储和传递与系统环境相关信息的一种机制,是以键值对形式定义的全局变量,供操作系统和应用程序读取和使用。
通常格式为:
当VALUE为多个时,以‘:’符号隔开
KEY=VALUE
- KEY:变量名
- VALUE:对应值
那么它究竟有什么作用呢?我们来看这个例子:
从上面我们可以看到存在一个可执行程序test
,第一次我们执行它,程序并没有正常运行,当然都知道因为没有指定程序所在路径,所以程序不能正常运行,第二次指定了不就运行成功了,那么我们的指令在执行时为什么不用指定路径呢?在指令篇我们就介绍过,指令的本质就是一个写好的可执行程序,当时我们说,如果我们想要让自己写的,可执行程序,像指令一样直接运行,我们可以将程序拷贝到指令所在路径下:/usr/bin
那还是没有解释为什么指令可以直接运行,或者说bash
是如何找到指令的可执行程序的呢?还有没有其他方法可以使我们的可执行程序像指令一样运行呢?接下来我们来认识一下本篇第一个环境变量:PATH
PATH
是操作系统中最核心的环境变量之一,当我们在命令行输入一个命令时,操作系统会按照PATH中定义的目录依次搜索该命令对应的可执行文件,若未找到该命令对应的可执行文件就会提示:command not found
。
查看PATH:
echo $PATH
PATH环境变量对应多个值,使用“:"隔离开
所以当我们将自己写的可执行文件,拷贝到/usr/bin
路径下,系统在PATH
对应的目中就可以找到。
还有什么方法可以解决这里的问题呢?只需要将我们自己写的可执行程序所在路径添加到PATH
环境变量中,不就也可以完成搜索了
PATH=$PATH:/home/ltn/dir
刚才的test于前面路径存在的,可执行程序重名了,所以又换了个程序给大家演示,但这恰恰说明了系统是从第一个路径向后搜索程序的。
我们使用which
查找指令时,就是在PATH
环境变量中搜索的,所以现在我们就可以像查找指令一样查找我们自己的可执行程序了。
二、常见的环境变量
环境变量 | … 作用 | 对应VALUE |
---|---|---|
HOME | 当前用户的主目录路径 | /home/ltn |
USER | 当前登录用户名 | ltn |
PWD | 当前工作目录路径 | /home/ltn |
HISTSIZE | 记录历史指令最大数 | 10000 |
查看环境变量:
查看所有环境变量:
env
查看指定环境变量:
echo $环境变量名
仅是截取的一部分
三、环境变量特点及其相关指令
为了方便接下来的讲解,我先带大家认识一个关于环境变量的系统调用接口:
头文件:#include
参数:环境变量名
返回值:如果存在则返回一个指向环境变量名的指针,否则返回NULL
3.1 环境变量的全局性
环境变量最开始是在我们登录xshell时,操作系统给bash
形成的,当我们执行某些指令时,bash
会创建子进程,并且将环境变量继承下来(当然会做某些修改),简单来说:环境变量是子进程从父进程那里继承下来的。
接下来我们验证一下!!!
创建我们自己的环境变量:
export ltn =”1234“
我们在当前bash
进程定义了一个环境变量,如果子进程会继承父进程的环境变量,则可以打印出结果,否则程序什么都不输出。
#include #include #include int main() { printf("子进程的ltn->%s\n",getenv("ltn")); return 0; }
可以看到程序成功打印,所以子进程会继承父进程的环境变量。
3.2、环境变量的生命周期
- 环境变量的生命周期与进程绑定
- 进程终止时,环境变量也会被回收
正是有了继承的这种形式,我们之前所提到的权限概念,才会被每条指令遵守。
删除环境变量:
unset ltn
四、环境变量的组织方式
我们之前在学习的C语言,不知道你有没有听过main
函数的参数:
int main(int argc, char *argv[], char *env[])
第三个参数我们先不验证
#include #include #include int main(int argc, char *argv[], char *env[]) { int i=0; for(;i%s\n",i,argv[i]); } return 0; }
这样一段代码,当我们执行它时,结果会怎么样呢?
可以看到我们以上面两种不同的方式执行,程序打印出了两种不同的结果,要知道怎么会这样,我们还是要知道参数是什么意思:
参数一 argc
作用:记录命令行参数的数量
规则:
1、argc的值至少为1,因为第一个参数始终是程序自身的名称。
2、用户输入的每个参数(以空格分隔)都会增加argc的值。
参数二 argv
作用:存储命令行参数的具体值(用空格分开的代表不同参数),以字符串数组的形式表示
规则:
1、argv[0] 是程序名称(可能包含路径,取决于调用方式)。
2 、argv[1] 到 argv[argc-1] 是用户输入的参数。
3、 argv[argc] 是一个空指针(NULL),表示数组结束。
参数三、env
作用:指向系统的环境变量数组(从bash那继承的),每个元素是 KEY=VALUE 格式的字符串。
规则:
1、 环境变量数组以 NULL
结尾。
2、可以通过 getenv()
函数更安全地获取特定环境变量。
当知道了main函数
的这些参数,我们就可以理解,为什么同一个指令加上不同的选项会有不同的功能了:当你在执行指令是带上不同参数,它就会存入到argv
数组中,然后通过if else
语句匹配不同代码块。实现不同功能。
五、C语言对环境变量的操作
5.1 设置环境变量:setenv
头文件:#include
参数:
name:设置的环境变量名
value:设置的环境变量值
overwrite:是否覆盖已有值(非零表示覆盖)
示例:
#include #include #include int main(int argc, char *argv[], char *env[]) { if(setenv("ltn","Hell Linux",0)==0); { printf("ltn set to->%s\n",getenv("ltn")); } return 0; }
5.2 删除环境变量:unsetenv
头文件:#include
参数:
name:环境变量名
示例:
#include #include #include int main(int argc, char *argv[], char *env[]) { if(setenv("ltn","Hell Linux",0)==0); { printf("ltn set to->%s\n",getenv("ltn")); } unsetenv("ltn"); printf("ltn->%s\n",getenv("ltn")); return 0; }
创建好,并删除
5.3 遍历所有环境变量:environ
environ
是一个全局变量,内部存有所有环境变量的指针,,末尾指针指向NULL,具体介绍太长,不方便展示,大家可以自己看。
示例:
#include #include #include extern char**environ; int main(int argc, char *argv[], char *env[]) { char **env1=environ; while(*env1) { printf("%s",*env1); env1++; } return 0; }
仅截取部分打印结果
下面我们来说一下第三给参数,第三参数,是一个环境变量数组,也就是说,我们可以通过直接变量得到全部环境变量:
#include #include #include extern char**environ; int main(int argc, char *argv[], char *env[]) { int i=0; while(env[i]) { printf("%s\n",env[i]); i++; } return 0; }
Linux中Bash环境变量的配置方法
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
以下是几种shell版本,bash是默认的:
sh(全称 Bourne Shell): 是UNIX最初使用的 shell,而且在每种 UNIX 上都可以使用。
Bourne Shell 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种 shell。
bash(全称 Bourne Again Shell): LinuxOS 默认的,它是 Bourne Shell 的扩展。
与 Bourne Shell 完全兼容,并且在 Bourne Shell 的基础上增加了很多特性。可以提供命令补全,命令编辑和命令历史等功能。它还包含了很多 C Shell 和 Korn Shell 中的优点,有灵活和强大的编辑接口,同时又很友好的用户界面。
csh(全称 C Shell): 是一种比 Bourne Shell更适合的变种 Shell,它的语法与 C 语言很相似。
Tcsh: 是 Linux 提供的 C Shell 的一个扩展版本。
Tcsh 包括命令行编辑,可编程单词补全,拼写校正,历史命令替换,作业控制和类似 C 语言的语法,他不仅和 Bash Shell 提示符兼容,而且还提供比 Bash Shell 更多的提示符参数。
ksh (全称 Korn Shell): 集合了 C Shell 和 Bourne Shell 的优点并且和 Bourne Shell 完全兼容。
pdksh: 是 Linux 系统提供的 ksh 的扩展。
pdksh 支持人物控制,可以在命令行上挂起,后台执行,唤醒或终止程序。
下面看下Linux中Bash环境变量的配置
在Linux中,我们一般将环境变量信息配置到不同的文件中,常用的配置文件有
- /etc/profile
- /etc/bashrc
- ~/.bash_profile
- ~/.bashrc
- ~/.bash _logout
上面几个配置主要是在交互式登录Shell和交互式非登录Shell有区别,会加载不同的配置。
交互式登录Shell
就是登录Linux系统,你输入用户名和密码后执行的,或su -l.
用户名方式
非登录Shell
就是你进入系统后,开一个终端Bash执行的。
/etc/profile
一般为系统配置,为系统的每个用户设置环境信息, 当用户第一次登录时,该文件被执行, 并从/etc/profile.d
目录的配置文件中搜集shell的设置.
对 /etc/profile
的修改必须得重启才会生效,而且每个用户都是有效的。
/etc/profile.d/
可以理解为/etc/profile
的一部分,只不过可以根椐类别或功能将配置拆分成若干个文件,这样更清晰也便于维护。
/etc/bashrc
为每个运行 Bash Shell 的用户执行该文件,当Bash Shell打开时,该文件被执行,其配置对所有使用bash的用户打开的每个Bash都有效。当被修改后,不用重启只需要打开一个新的 Bash 即可生效。
~/.bash_profile
文件在用户目录下,为当前用户设置专属的环境信息和启动程序,当用户登录时该文件执行一次,并执行当前用户的 .bashrc
文件。如果有修改,也需要重启才能生效。
~/.bashrc
为当前用户设置专属的 Bash 信息,当每次打开新的Shell时,该文件被执行。如有修改,不需要重启只需要开一个新的Shell终端就行了。
~/.bash_logout
当前用户每次退出Bash Shell时执行该文件。
以上需要重启才能生效的文件,是通过类似 source ~/.bash_profile
这样的方式暂时生效的,并不是真的重启电脑。
以上就是详解Linux中常见环境变量的特点与设置的详细内容,更多关于Linux环境变量的资料请关注主机测评网其它相关文章!
本文由主机测评网发布,不代表主机测评网立场,转载联系作者并注明出处:https://zhuji.jb51.net/linux/8666.html