Linux中环境变量配置的步骤详解
<p><span><strong>简介</strong></span></p>
<p>
我们大家在平时使用linux的时候,经常需要配置一些环境变量,这时候一般都是网上随便搜搜就有人介绍经验的。不过问题在于他们的方法各不相同,有人说配置在/etc/profile里,有人说配置在/etc/environment,有人说配置在~/.bash_profile里,有人说配置在~/.bashrc里,有人说配置在~/.bash_login里,还有人说配置在~/.profile里。。。这真是公说公有理。。。那么问题来了,linux到底是怎么读取配置文件的呢,依据又是什么呢?下面这篇文章就来给大家详细的介绍下,一起来看看吧。</p>
<p>
<span><strong>文档</strong></span></p>
<p>
我一向讨厌那种说结论不说出处的行为,这会给人一种“我凭什么相信你”的感觉。而且事实上没有出处就随便议论得出的结论也基本上是人云亦云的。事实上,与其去问别人,不如去问文档。 找了一会,发现关于环境变量配置的相关文档其实是在bash命令的man文档里,毕竟我们常用的就是这个shell。</p>
<p>
在$man bash里,我发现了下面的一段文字:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterplain" id="highlighter_19241">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">invocation</code>
</div>
<div class="line number2 index1 alt1">
<code class="plain spaces"> </code><code class="plain plain">a login shell is one whose first character of argument zero is a -, or</code>
</div>
<div class="line number3 index2 alt2">
<code class="plain spaces"> </code><code class="plain plain">one started with the --login option.</code>
</div>
<div class="line number4 index3 alt1">
<code class="plain spaces"> </code><code class="plain plain">an interactive shell is one started without non-option arguments and</code>
</div>
<div class="line number5 index4 alt2">
<code class="plain spaces"> </code><code class="plain plain">without the -c option whose standard input and error are both connected</code>
</div>
<div class="line number6 index5 alt1">
<code class="plain spaces"> </code><code class="plain plain">to terminals (as determined by isatty(3)), or one started with the -i</code>
</div>
<div class="line number7 index6 alt2">
<code class="plain spaces"> </code><code class="plain plain">option. ps1 is set and $- includes i if bash is interactive, allowing</code>
</div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code><code class="plain plain">a shell script or a startup file to test this state.</code>
</div>
<div class="line number9 index8 alt2">
<code class="plain spaces"> </code><code class="plain plain">the following paragraphs describe how bash executes its startup files.</code>
</div>
<div class="line number10 index9 alt1">
<code class="plain spaces"> </code><code class="plain plain">if any of the files exist but cannot be read, bash reports an error.</code>
</div>
<div class="line number11 index10 alt2">
<code class="plain spaces"> </code><code class="plain plain">tildes are expanded in filenames as described below under tilde expan‐</code>
</div>
<div class="line number12 index11 alt1">
<code class="plain spaces"> </code><code class="plain plain">sion in the expansion section.</code>
</div>
<div class="line number13 index12 alt2">
<code class="plain spaces"> </code><code class="plain plain">when bash is invoked as an interactive login shell, or as a non-inter‐</code>
</div>
<div class="line number14 index13 alt1">
<code class="plain spaces"> </code><code class="plain plain">active shell with the --login option, it first reads and executes com‐</code>
</div>
<div class="line number15 index14 alt2">
<code class="plain spaces"> </code><code class="plain plain">mands from the file /etc/profile, if that file exists. after reading</code>
</div>
<div class="line number16 index15 alt1">
<code class="plain spaces"> </code><code class="plain plain">that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile,</code>
</div>
<div class="line number17 index16 alt2">
<code class="plain spaces"> </code><code class="plain plain">in that order, and reads and executes commands from the first one that</code>
</div>
<div class="line number18 index17 alt1">
<code class="plain spaces"> </code><code class="plain plain">exists and is readable. the --noprofile option may be used when the</code>
</div>
<div class="line number19 index18 alt2">
<code class="plain spaces"> </code><code class="plain plain">shell is started to inhibit this behavior.</code>
</div>
<div class="line number20 index19 alt1">
<code class="plain spaces"> </code><code class="plain plain">when a login shell exits, bash reads and executes commands from the</code>
</div>
<div class="line number21 index20 alt2">
<code class="plain spaces"> </code><code class="plain plain">file ~/.bash_logout, if it exists.</code>
</div>
<div class="line number22 index21 alt1">
<code class="plain spaces"> </code><code class="plain plain">when an interactive shell that is not a login shell is started, bash</code>
</div>
<div class="line number23 index22 alt2">
<code class="plain spaces"> </code><code class="plain plain">reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if</code>
</div>
<div class="line number24 index23 alt1">
<code class="plain spaces"> </code><code class="plain plain">these files exist. this may be inhibited by using the --norc option.</code>
</div>
<div class="line number25 index24 alt2">
<code class="plain spaces"> </code><code class="plain plain">the --rcfile file option will force bash to read and execute commands</code>
</div>
<div class="line number26 index25 alt1">
<code class="plain spaces"> </code><code class="plain plain">from file instead of /etc/bash.bashrc and ~/.bashrc.</code>
</div>
<div class="line number27 index26 alt2">
<code class="plain spaces"> </code><code class="plain plain">when bash is started non-interactively, to run a shell script, for</code>
</div>
<div class="line number28 index27 alt1">
<code class="plain spaces"> </code><code class="plain plain">example, it looks for the variable bash_env in the environment, expands</code>
</div>
<div class="line number29 index28 alt2">
<code class="plain spaces"> </code><code class="plain plain">its value if it appears there, and uses the expanded value as the name</code>
</div>
<div class="line number30 index29 alt1">
<code class="plain spaces"> </code><code class="plain plain">of a file to read and execute. bash behaves as if the following com‐</code>
</div>
<div class="line number31 index30 alt2">
<code class="plain spaces"> </code><code class="plain plain">mand were executed:</code>
</div>
<div class="line number32 index31 alt1">
<code class="plain spaces"> </code><code class="plain plain">if [ -n "$bash_env" ]; then . "$bash_env"; fi</code>
</div>
<div class="line number33 index32 alt2">
<code class="plain spaces"> </code><code class="plain plain">but the value of the path variable is not used to search for the file‐</code>
</div>
<div class="line number34 index33 alt1">
<code class="plain spaces"> </code><code class="plain plain">name.</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
通过这段文字,我们发现其实所谓的环境变量配置文件,就是在shell登陆的时候自动加载的那些文件。不过他所定义的登陆却分为两种:</p>
<ul>
<li>
login shell登陆。</li>
<li>
interactive shell登陆。</li>
</ul>
<p>
<span><strong>login shell 登陆</strong></span></p>
<p>
所谓的login shell登陆,实际上就是指需要输入密码的登陆。具体的说,包括开机登陆、ssh登陆,或者是输入bash --login这种“假装自己输入密码登陆”的方式。 在这种登陆方式下,系统会先读取/etc/profile文件,然后,系统会依次搜索~/.bash_profile、~/.bash_login、~/.profile 这三个文件,并运行只其中第一个存在的文件。 尤其要注意到后三个文件的“逻辑或”的关系。很多情况下我们会发现,明明已经修改了~/.profile文件为什么重新登陆后配置不生效呢?这是因为我们的系统可能存在了前面两个文件中的一个,导致不会继续读取剩下的文件。</p>
<p>
<strong>下面的三张图很好的说明了这个问题:</strong></p>
<p>
<img title="Linux中环境变量配置的步骤详解" alt="Linux中环境变量配置的步骤详解" src="https://zhuji.jb51.net/uploads/img/202305/41776536194b759be88bfc894f638b88.jpg"></p>
<p>
<img title="Linux中环境变量配置的步骤详解" alt="Linux中环境变量配置的步骤详解" src="https://zhuji.jb51.net/uploads/img/202305/8f5259f7c824528cc880a6ab388ee843.jpg"></p>
<p>
<img title="Linux中环境变量配置的步骤详解" alt="Linux中环境变量配置的步骤详解" src="https://zhuji.jb51.net/uploads/img/202305/0c393e2e2ce79a77c7ea3ed0ad1e0918.jpg"></p>
<p>
<span><strong>interactive shell 登陆</strong></span></p>
<p>
所谓的interactive shell登陆,其实就是相对于login shell登陆而言的。我们平时在登陆后右键打开终端、或者ctrl+alt+t打开终端都是interactive shell登陆。 在这种登陆方式下,系统会依次读取/etc/bash.bashrc和~/.bashrc,并加以执行。 通常情况下,~/.bashrc文件里会默认记录一些常量和一些别名,尤其是$ps1变量,这个变量决定着bash提示符的格式、样式以及颜色等。</p>
<p>
<span><strong>注意:</strong></span></p>
<p>
需要注意的是,这两种登陆方式读取的是不同的配置文件,而且互相之间没有交集,因此当我们需要配置环境变量时,我们要根据自己的登陆方式将需要的变量配置到不同的文件里。 例如下面这个经典的问题。</p>
<p>
<span><strong>典型问题</strong></span></p>
<p>
环境配置文件配置异常的例子是,当我用ssh登录服务器的时候,发现提示符是这样的:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_380246">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash functions">bash</code><code class="bash plain">-4.3$</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
没错,就像上面第三张图片里的那个bash一样,提示符非常奇怪,而且当输入ls时文件和文件夹的颜色也没有区分。 这个问题显然是由于$ps1这个环境变量没有配置,导致他用了默认值,虽然查看.bashrc文件时发现有$ps1这个变量的定义。,但是由于ssh属于login shell,因此他在登陆时读入的配置文件是/etc/profile一类的文件,并没有读入.bashrc。 导致这个问题的原因通常是我们误删除了/etc/profile里默认的配置文件,因此解决的办法也很简单。。。把.bashrc里的部分文件复制到/etc/profile里就行了。</p>
<p>
这个问题给我们的启示是,当我们为服务器配置变量时,尽量配置到/etc/profile里或者~/.bash_profile里,因为用ssh登录服务器是基本上用不到.bashrc文件的;当我们给自己的电脑配置环境变量时,尽量配置到.bashrc里,因为这样我们只要打开终端就会读入这个文件,这样就可以不用注销就能应用配置了(只有注销重新登录才会应用/etc/profile一类的配置文件)。</p>
<p>
<span><strong>总结</strong></span></p>
<p>
以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。</p>
<p>
原文链接:https://blog.mythsman.com/2017/03/28/1/</p>
頁:
[1]