目录
linux为什么需要环境变量?
全局变量VS环境变量
Shell 配置文件
Shell 执行顺序
修改配置文件
shell启动方式对变量的影响
因为Linux执行一些命令时,它会去很多目录去搜索对应的可执行程序,如果可执行程序分散在不同的目录下,当搜索时,这样会非常的耗费时间,所以Linux就约定,当执行一个命令时,就到一个指定的文件中去寻找可执行程序所在的目录,这个指定的文件就是环境变量配置文件。
野火原话:因为Linux是一个多用户多任务的系统,每个用户所需要的系统运行环境不一样,只有对Linux不同的用户设置不同的环境变量,才能满足不同用户的需求。
环境变量其实是Shell变量的一种
直接定义
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配置文件里面的代码,来做一些初始化的工作
与 Bash Shell 有关的配置文件主要有
/etc/profile
~/.bash_profile
~/.bash_login
~/.profile
~/.bashrc
/etc/bashrc
/etc/bash.bashrc
/etc/profile.d/*.sh
这些配置文件在Bash Shell中有不同的执行时间:
/etc/profile
:这是系统的全局配置文件,会在系统启动时被执行,为所有用户设置环境变量和执行系统级别的初始化任务。
~/.bash_profile
、~/.bash_login
、~/.profile
:这些是用户个人的配置文件,在用户登录时被执行。它们按照优先级的顺序被Bash寻找并执行,一般选择其中一个进行配置即可,优先级从上到下逐渐降低。
~/.bashrc
:这是用户个人的配置文件,会在每次打开新的Bash终端窗口时被执行。它用于设置用户特定的环境变量、别名、自定义函数等。
/etc/bashrc
、/etc/bash.bashrc
:这些是系统级别的Bash配置文件,会在每次打开新的Bash终端窗口时被执行,为所有用户设置系统级别的环境变量和执行其他初始化任务。
/etc/profile.d/*.sh
:这是一个目录,其中包含了一些以.sh
结尾的Shell脚本文件。这些脚本文件会在用户登录时自动执行,可以用于加载特定应用程序或库的环境变量和配置信息。
需要注意的是,全局配置文件(如/etc/profile
和/etc/profile.d/*.sh
)通常对所有用户生效,而用户个人配置文件(如~/.bash_profile
和~/.bashrc
)只针对当前登录的用户。
在执行时的顺序是:
/etc/profile
。~/.bash_profile
、~/.bash_login
或~/.profile
(仅执行第一个存在的)。在这里面的全局变量仅对特定用户生效~/.bashrc
,如果存在的话。/etc/bashrc
和/etc/bash.bashrc
。在这里面的全局变量对所有用户生效其实就是根目录/和家目录的区别
通过编辑和定制这些配置文件,可以实现系统级别和个人级别的配置,自定义环境变量、别名、函数等,以及加载其他自定义的Shell脚本。
/etc/profiles->~/.profile(~/.bash_profile、~/.bash_login)
sudo vi /etc/profile
全部用户、全部进程共享:/etc/bash.bashrc
gec@ubuntu:~$ sudo vi /etc/bash.bashrc
一个用户、全部进程共享:~/.bashrcshell启动方式对变量的影响
gec@ubuntu:~$ sudo vi .bashrc
子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