Linux基础与应用开发系列二:Linux环境变量

目录

linux为什么需要环境变量?

全局变量VS环境变量

Shell 配置文件

Shell 执行顺序

修改配置文件

shell启动方式对变量的影响

linux为什么需要环境变量?

因为Linux执行一些命令时,它会去很多目录去搜索对应的可执行程序,如果可执行程序分散在不同的目录下,当搜索时,这样会非常的耗费时间,所以Linux就约定,当执行一个命令时,就到一个指定的文件中去寻找可执行程序所在的目录,这个指定的文件就是环境变量配置文件。

野火原话:因为Linux是一个多用户多任务的系统,每个用户所需要的系统运行环境不一样,只有对Linux不同的用户设置不同的环境变量,才能满足不同用户的需求。

环境变量其实是Shell变量的一种

全局变量VS环境变量

直接定义

gec@ubuntu:~$ abc=123
gec@ubuntu:~$ echo abc
abc
gec@ubuntu:~$ echo $abc
123
gec@ubuntu:~$ /bin/bash
gec@ubuntu:~$ echo $abc

gec@ubuntu:~$ exit
exit
gec@ubuntu:~$ echo $abc
123
gec@ubuntu:~$ export abc
gec@ubuntu:~$ /bin/bash
gec@ubuntu:~$ echo $abc
123

export

export命令可以将一个变量导出(或称为设置为环境变量),以便子进程可以观察和使用该变量

当你在Shell中使用export命令导出一个变量时,该变量会被添加到当前Shell进程的环境中,并且在该Shell进程及其所有子进程中可见。这意味着,任何由当前Shell启动的子进程都可以访问并使用这个环境变量。

例如,假设在Shell中定义了一个变量MY_VAR并使用export命令导出:

$ MY_VAR="Hello, world" $ export MY_VAR

然后,启动一个新的子进程,比如运行一个脚本:

$ ./myscript.sh

myscript.sh这个脚本中,可以直接访问和使用MY_VAR这个环境变量,因为它已经被导出到了子进程中。

需要注意的是,当子进程修改了继承自父进程的环境变量的值时,并不会影响到父进程或其他同级子进程中该环境变量的值。每个进程都有自己的环境变量副本,修改其中一个进程中的环境变量不会影响到其他进程。

因此,使用export命令可以方便地在父进程和子进程之间传递变量和共享信息,实现进程间的数据交换和通信。

Shell 配置文件

实际上,在Shell进程每次启动的时候,它都会执行Shell配置文件里面的代码,来做一些初始化的工作

与 Bash Shell 有关的配置文件主要有

  1. /etc/profile  

  2. ~/.bash_profile

  3. ~/.bash_login

  4. ~/.profile

  5. ~/.bashrc

  6. /etc/bashrc

  7. /etc/bash.bashrc

  8. /etc/profile.d/*.sh

这些配置文件在Bash Shell中有不同的执行时间:

  1. /etc/profile:这是系统的全局配置文件,会在系统启动时被执行,为所有用户设置环境变量和执行系统级别的初始化任务。

  2. ~/.bash_profile~/.bash_login~/.profile:这些是用户个人的配置文件,在用户登录时被执行。它们按照优先级的顺序被Bash寻找并执行,一般选择其中一个进行配置即可,优先级从上到下逐渐降低。

  3. ~/.bashrc:这是用户个人的配置文件,会在每次打开新的Bash终端窗口时被执行。它用于设置用户特定的环境变量、别名、自定义函数等。

  4. /etc/bashrc/etc/bash.bashrc:这些是系统级别的Bash配置文件,会在每次打开新的Bash终端窗口时被执行,为所有用户设置系统级别的环境变量和执行其他初始化任务

  5. /etc/profile.d/*.sh:这是一个目录,其中包含了一些以.sh结尾的Shell脚本文件。这些脚本文件会在用户登录时自动执行,可以用于加载特定应用程序或库的环境变量和配置信息。

需要注意的是,全局配置文件(如/etc/profile/etc/profile.d/*.sh)通常对所有用户生效,而用户个人配置文件(如~/.bash_profile~/.bashrc)只针对当前登录的用户。

在执行时的顺序是:

  1. 登录时,先执行全局配置文件/etc/profile
  2. 然后根据优先级选择并执行用户个人配置文件,一般为~/.bash_profile~/.bash_login~/.profile(仅执行第一个存在的)。在这里面的全局变量仅对特定用户生效
  3. 在打开新的Bash终端窗口时,会执行用户个人配置文件~/.bashrc,如果存在的话。
  4. 同时,在每次打开新的Bash终端窗口时,也会执行系统级别的配置文件/etc/bashrc/etc/bash.bashrc在这里面的全局变量对所有用户生效

其实就是根目录/和家目录的区别

通过编辑和定制这些配置文件,可以实现系统级别和个人级别的配置,自定义环境变量、别名、函数等,以及加载其他自定义的Shell脚本。

Shell 执行顺序

/etc/profiles->~/.profile(~/.bash_profile、~/.bash_login)

sudo vi /etc/profile

Linux基础与应用开发系列二:Linux环境变量_第1张图片

 sudo vi ~/.profile
Linux基础与应用开发系列二:Linux环境变量_第2张图片

 

修改配置文件

全部用户、全部进程共享:/etc/bash.bashrc

gec@ubuntu:~$ sudo vi /etc/bash.bashrc 

Linux基础与应用开发系列二:Linux环境变量_第3张图片


一个用户、全部进程共享:~/.bashrcshell启动方式对变量的影响

gec@ubuntu:~$ sudo vi .bashrc

Linux基础与应用开发系列二:Linux环境变量_第4张图片

 

子shell进程中执行:/bin/bash和./

当前进程中执行:source和.

xiaoming@ubuntu:/home/gec$ sudo vi test2.sh
[sudo] xiaoming 的密码: 
xiaoming@ubuntu:/home/gec$ sudo chmod 777 test2.sh
xiaoming@ubuntu:/home/gec$ ./test2.sh
xiaoming@ubuntu:/home/gec$ su gec
密码: 
gec@ubuntu:~$ source test2.sh
gec@ubuntu:~$ echo $a
111
gec@ubuntu:~$ echo $b
222
gec@ubuntu:~$ unset a b
gec@ubuntu:~$ echo $a

gec@ubuntu:~$ echo $b

gec@ubuntu:~$ . test2.sh
gec@ubuntu:~$ echo $a
111
gec@ubuntu:~$ echo $b
222
gec@ubuntu:~$ unset a b

gec@ubuntu:~$ /bin/bash test2.sh
gec@ubuntu:~$ echo $a

gec@ubuntu:~$ echo $b


你可能感兴趣的:(linux,运维,服务器)