目录
大家天天开心🙂
- bash进程的流程。
- 环境变量在系统指令和用户程序的应用。
- 环境变量修改(命令行&配置文件的修改)理解。
前言
明确
- Linux当中70%以上的命令程序都是用C语言写的
- 执行命令程序和运行自己写的程序没有任何区别
- 自己程序运行必须要带路径(绝对/相对都可)
- 系统指令可带可不带(带不要瞎带)
- 环境变量具有全局特性是可以被子进程看到的
无论是全局变量还是局部变量,子进程的代码是继承父进程的,数据是拷贝的(子进程和父进程的数据是相互独立的)- 进程的独立性:父进程的数据是可以被子进程看到&访问(修改❌),子进程的数据是不能被父进程看到。
- 每个用户启动都会有一个单独的bash进程,bash单独给这个用户形成命令行参数表和环境变量表。以及配置文件都是每个用户都有一份。互相独立,不影响。
- 每开启一个终端就会有1个bash进程。
- 一个用户也可以有多个bash进程。
回顾上篇博文
- 登录Linux系统
- 创建bash进程
- 在命令行中输入参数
- bash进程获取参数的路径&可执行程序
- 可执行程序是用户自己写(自己带路径)
- 可执行程序是系统指令(在bash进程的上下文环境变量中找)
- 创建子进程
- bash并把【命令行参数表】传给子进程main函数(传参)
- 子进程接着执行自己的代码
产生这样一个问题:为什么我们自己的程序运行启动的时候需要带路径,但是系统的命令程序可带可不带路径❓
回答:在Linux当中,存在一些全局变量的设置(环境变量),告诉命令行解释器(bash进程),应该去那些路径底下去寻找这些可执行程序。
☞综下:ls不用带路径,因为ls所在的路径在环境变量当中。
基本概念&理解
概念&特性
- 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
- 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
- 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性 。
- 环境变量都是大写。
整体理解
- 登录Linux系统的时候,OS就把系统配置已经加载到了bash进程的上下文中(内存),系统配置就包括环境变量。
- 当用户在命令行解释器中输入系统命令的时候,bash进程就拿到了命令行参数,根据环境变量,找到指令的可执行程序和路径,并创建指令的子进程。
- (bash进程会根据$PATH在自己内存的上下文 配置信息中的 各种环境变量中找到对应的环境变量,并在此环境变量中找到对应的指令程序的路径和可执行程序)。
环境变量的作用
- bash在执行命令的时候,需要先找到命令。因为要把命令所对应的二进制文件加载到内存中。
- bash的上下文的环境变量中维护了一批指令的路径。
- 默认这批指令的路径是bash创建子进程的搜索路径。
- 找到了就加载并运行
- 没找到就commend not fund
- 注意❗:系统中有很多配置,在我们登录Linux系统的时候,已经被加载到了bash进程中(内存中)
- 注意❗:有部分指令程序&路径就在bash进程数据内部,不在环境变量PATH中,不受环境变量的影响。(后面讲)
- 注意❗每个用户都一套的环境变量是从bash进程中拷贝的。修改A用户底下的环境变量并不会影响B用户底下的环境变量。
其中PATH就是一个典型的环境变量,☞PATH下面我们以PATH来讲解环境变量。
注意的点
- 注意❗:系统中有很多配置,在我们登录Linux系统的时候,已经被加载到了bash进程中(内存中)。
- 注意❗:有部分指令程序&路径就在bash进程数据内部,不在环境变量PATH中,不受环境变量的影响。(后面讲)。
- 注意❗每个用户都一套的环境变量是从bash进程中拷贝的。修改A用户底下的环境变量并不会影响B用户底下的环境变量。
关于在修改环境变量中:
- 不维护在bash进程的配置文件中的环境变量中的指令路径,是不受环境变量修改的影响,随时可用。
- 命令行中修改用户A的环境变量,是不会影响到A用户的bash进程/用户B进程/OS中的配置文件中的环境变量,只会影响当前用户当前进程。重启之后也不会影响,因为bash进程会重新读取。
- 配置文件中修改用户A的环境变量,也不是会影响其他用户的bash进程/当前运行进程/OS中的其他用户的配置文件的环境变量,会影响当前用户的bash进程,正在运行进程和当前用户A中配置文件,重启也会影响。
- 关键点:在重启,用户&用户,用户进程&用户进程。
- 每个用户启动都会有一个单独的bash进程,bash单独给这个用户形成命令行参数表和环境变量表。以及配置文件都是每个用户都有一份。互相独立,不影响。
- 每开启一个终端就会有1个bash进程。
- 一个用户也可以有多个bash进程
查看环境变量的方法
- Linux系统登录
- bash进程启动,OS把配置信息加载到bash进程上下文中
- 输入指令echo信息
- bash在环境变量中找到的指令程序的路径运行(echo的程序&路劲就在bash数据段内部,不在环境变量中)
- 创建echo指令的子进程
- bash把命令行参数给echo子进程,子进程执行
- PATH中有很多路径,这些路径以冒号:为分隔符分割,划分了路径的区域。
echo $NAME //NAME:你的环境变量名称
echo $PATH //打印环境变量PATH的内容
PATH环境变量
- 如果我们执行我们的系统指令程序,在命令行中不需要输入指令,因为bash进程会到环境变量中找到指令的路径从而找到指令的可执行程序。
- 如果我们执行用户程序,环境变量中没有维护,所以我们需要在命令行输入时带上路径,以便于bash进程找到可执行程序。
综下所述:PATH环境变量是Linux环境变量中搜索可执行程序的默认路径,也是which在PATH中的搜索路径。
PTAH应用系统指令
- PATH环境变量是具有全局特性的。
- PATH变量里面保存了指令的路径。
- 系统中有很多配置,在我们登录Linux系统的时候,已经被加载到了bash进程中(内存中),其中包括环境变量PATH。
- bash在执行命令的时候,需要先找到命令。因为要把命令所对应的二进制文件加载到内存中。
- bash的上下文的环境变量中维护了一批指令的路径。
- 默认这批指令的路径是bash创建子进程的搜索路径。
- 找到了就加载并运行
- 没找到就commend not fund
PTAH应用用户程序
❓关于我们的用户程序能否和系统指令一样呢。也不用带路径就可以运行。
修改PATH环境变量:
- 命令行修改
- 配置文件修改
关于命令行&配置文件修改的理解(关键在重启和不同的用户)
- 每个用户启动都会有一个单独的bash进程,bash单独给这个用户形成命令行参数表和环境变量表。以及配置文件都是每个用户都有一份。互相独立,不影响。
- 每开启一个终端就会有1个bash进程。
- 一个用户也可以有多个bash进程。
- 命令行中修改用户A的环境变量,是不会影响到A用户的bash进程/用户B进程/OS中的配置文件中的环境变量,只会影响当前用户当前进程。重启之后也不会影响,因为bash进程会重新读取。
- 配置文件中修改用户A的环境变量,也不是会影响其他用户的bash进程/当前运行进程/OS中的其他用户的配置文件的环境变量,会影响当前用户的bash进程,正在运行进程和当前用户A中配置文件,重启也会影响。
- 命令行解释器就是bash进程
- 关键点:在重启,用户&用户,用户进程&用户进程。
命令行参数的修改(内存级)
想要在运行用户程序的时候不在加上程序路径,有两种方法
- 拷贝用户的可执行程序到环境变量的指定路径底下
- 添加用户的可执行程序的路径到环境变量中
❗注意以下:操作都是内存级别的,默认我们查到的环境变量都是内存级。内存级别的修改只是暂时的,如果我们重启Linux操作系统,那么环境变量依旧是以前的没有修改的,又会把配置文件没有任何修改的重新加载到内存中。
【方法1】
- 安装:sudo cp 用户程序 /usr/bin/
- 删除:sudo rm /usr/bin/a.out
- 将用户程序安装到bash的环境变量中环境变量中的指定路径下。
- 不建议拷贝用户程序到环境变量中,污染指令集。
- 这些操作本质上都是在OS中安装卸载(内存级别)。在环境变量中指定路径下的拷贝和删除用户的可执行程序。
【方法2】
- PARH=路径(路径会覆盖以前的全部路径)
- PATH=以前的所有路径+新添加的路径
- PATH=$PTAH:新添加的路径(简写)
- 把指定路径添加到环境变量里,而不是直接让新路径把环境变量覆盖了。
- 关于覆盖:有部分指令程序&路径就在bash进程数据内部,不在环境变量PATH中,不受环境变量的影响,即便覆盖也可以运行。
【方法1】
安装:sudo cp 用户程序 /usr/bin/
删除:sudo rm /usr/bin/a.out
【方法2】
PARH=路径(路径会覆盖以前的全部路径)
PATH=以前的所有路径+新添加的路径
PATH=$PTAH:新添加的路径(简写)
配置文件的修改
问题又出现了,想要让修改的内容永久有效怎么办?
- 最开始的环境变量不是在内存中,而是在磁盘系统的对应的配置文件中。
- 登录Linux操作系统的时,磁盘中的配置文件会加载到内存的OS中。
- OS会创建一个bash进程。
- bash进程会读取内存中OS的配置文件。
- bash进程会把配置文件的环境变量拷贝一份到自己的进程数据中。
- 每个进程使用的环境变量都是 bash/用户 内部的数据。(不同的用户使用的是自己/home/xxx的配置文件,每个用户都有一套)
- 每次登录都要重新读取 bash/用户自己底下 配置文件。
如果想要修改的环境变量永久有效,那么就要修改 用户底下/bash 的配置文件中的环境变量,那么这些配置文件在哪里呢?
- 每个用户(包括root)目录下 /home/xxxx 存在2个隐藏的配置文件
- .bash_profile
- .bashrc
- bash进程读取配置文件:文件操作fopen等(目前在命令行中查找环境变量都是内存级,存在bash的上下文中)
- 修改配置文件中的环境:在.bash_profile里面加上可执行程序的路径即可
- vim .bash_profile
- 添加新的路径到.bash_profile旧的路径后面,以冒号:为分割
-rw-r--r--. 1 tangsiqi tangsiqi 193 Aug 2 2017 .bash_profile
-rw-r--r--. 1 tangsiqi tangsiqi 231 Aug 2 2017 .bashrc
【.bashrc】
.bashrc是home目录下的一个shell文件,用于储存用户的个性化设置。 在bash每次启动时都会加载.bashrc文件中的内容,并根据内容定制当前bash的配置和环境。
vim .bashrc
【.bash_profile】
bash_profile 只对单一用户有效,文件存储位于 ~/.bash_profile ,该文件是一个用户级的设置,可以理解为某一个用户的 profile 目录下。 这个文件同样也可以用于配置环境变量和启动程序,但只针对单个用户有效。 和 profile 文件类似,bash_profile 也会在用户登录(login)时生效,也可以用于设置环境变理。
vim .bash_profile
windows环境变量
- cls是清屏&dir 是查看目录
- 系统的配置文件&用户的配置文件
- windows底下也是有命令行解释器的cwd
🙂感谢大家的阅读,若有错误和不足,欢迎指正。