古龙橙子味 發表於 2025-7-30 00:00:00

Linux中常见环境变量的特点与设置指南

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