文章目录
- 1. 什么是环境变量
- 情景导入
- 问题延申
- 环境变量的作用
- 总之
- 2. 环境变量的划分
- 3. 用户和局部变量的设定
- 4. 定义全局变量
- 5. 注意
- 6. 删除自己定义的全局变量、局部变量:
- 问题
- 7. printenv
- 8. 问题残留
- 9. 默认的环境变量
- 10. 如何添加环境变量
- 11. Linux中如何永久配置环境变量
- 了解
- 永久配置
- 12. 入门期末作业:怎么修改全局环境变量(注意:不要把原本的环境变量删了,否则可能导致很多命令运行不了)
- 13. 推荐
1. 什么是环境变量
情景导入
首先,Windows中:
命令打开cmd的两种方式:① win + R -> cmd -> 回车
② 左键单击开始菜单 -> 直接输入cmd (不用管在哪输入) -> 回车
命令打开calc-计算器(或notepad-记事本、mspaint-画图等)的三种方式
① 在cmd里输入calc -> 回车
② 左键单击开始菜单 -> 直接输入calc (不用管在哪输入) -> 回车
③ win + R -> calc -> 回车
进一步:
calc本质上是一个程序,它的位置在:
因此,上述对calc的操作本质上就是在C:\Windows\System32目录下双击打开计算器程序,这也是我们可以通过上述方式快速的打开这些程序的原因。
问题延申
问:为什么计算器程序明明在C:\Windows\System32目录下,可是我在任何目录都可以使用它(例如:C : \ Users \ 无妄 、E : \ 等) ?
答:因为这个程序的路径已经被写到了环境变量Path中。
注: C:\Windows\System32整个目录都被写入了Path中,意味着C:\Windows\System32这个路径下的所有文件和程序都可以在任何位置被访问。可以理解为办会员,假如我办了某家连锁酒店的会员,那么我在全球任何具有该酒店的地方都可以享受服务。
环境变量的作用
作用:预约。相当于去餐厅吃饭前,先在手机上预约位置和菜品,到餐厅以后直接给服务员一下手机号或者名字,服务员就会直接带我们到指定位置。
把内存类比为餐厅,把环境变量类比为服务员手里的单据。所以,虽然E盘中没有calc程序,但是由于我每次电脑一开机就已经在内存中给它预约过位置了,在环境变量里一找就能找到,因此,在任何地方都可以打开calc程序。
很多软件都默认配置了环境变量,因为如果它们不配置环境变量,系统就找不到它在哪(产生报错:…不是内部或外部命令,也不是可运行的程序或批处理文件)。java、python等软件使用前需要手动配置环境变量,以便在任何地方都可以使用。
总之
在用户需要时可以提供最好的服务,这就是环境变量。
无论在全球任何地方,都给会员用户(提前预约过了,明确过需求了)提供环境变量里的服务,这就是环境变量的作用。
2. 环境变量的划分
① Windows:用户变量和系统变量。一台电脑上可能有多个用户,每个用户设置的变量可能都不相同。只能在当前用户下使用的变量称为用户变量;像calc这种软件,注销当前用户,换成另一个用户后照样可以使用,它们的相关环境变量称为系统变量。
② linux:全局变量和局部变量。全局变量是对整个系统或者会话可见的变量,像cd、ls(ls等命令本质上说也是一个程序)这种,在哪都可以使用;局部变量是在当前进程或者shell中可见的变量(set可以查看当前shell的局部变量–了解即可)。
注:
① linux不同发行版的全局变量可能不同。
② 全局变量用的多。(此处的局部变量不同于编程的局部变量,编程时局部变量用的多)
3. 用户和局部变量的设定
定义:
变量名=“替代的内容”
echo $变量名
例如:
缺点:只能在当前shell使用
4. 定义全局变量
定义:
export 变量名=“替代的内容”
echo $变量名
例如:
缺点:并非对所有shell有效。(但是相对于刚刚的局部变量而言,此处在父shell设置的全局变量对所有子shell全部有效)
5. 注意
自己定义局部变量、全局变量时一定要全部小写,而且单词之间必须要用下划线隔开–企业强制要求。只有系统级别的变量(当前系统自带的变量、例如,安装Java Mysql时配置的也是系统级别的变量,因为它要修改的PATH变量是系统自带的)才写成大写。
6. 删除自己定义的全局变量、局部变量:
unset + 变量名
例如:
问题
问:在子shell里删除父shell里的全局变量,操作完退出子shell以后,发现父shell里依然可以使用刚刚的全局变量,为什么?
答:因为我们是在一个子进程中删除了这个全局变量,这个操作只对子进程有效,对父进程没有影响。
7. printenv
printenv展示的内容相当于Windows里系统变量的内容。
printenv USER --了解环境变量USER
printenv HOME --了解环境变量HOME
注:
用printenv查看全局变量,会发现全局变量的变量名全部是大写的,而且单词之间用下划线隔开(跟c语言定义全局变量一模一样–下划线命名法),这已经成为一个业界标准了。
echo $HOME --了解环境变量HOME $HOME可以代表/home/aria。例如,写ls /home/aria 时可以直接用 ls $HOME代替。
8. 问题残留
用上述方法同时设置一个全局变量和局部变量,为什么printenv会显示全局变量,不显示局部变量?
我不确定是否是下面的原因:
printenv作为一个外部命令,外部命令执行时会创建一个新的进程,ps -f又可以显示当前的进程,但是ps -f 看不到printenv相关信息。我觉得是因为ps -f报告的是系统当前的状态,可是printenv命令运行以后这个进程就会结束,因此用ps -f不会显示。
至于为什么在终端输入hh="haha"和export hw=“helloWord”,但是printenv只打印后者,正是因为printenv在执行是会创建一个新的进程,也可以理解为一个新shell,hh="haha"作为局部环境变量只对当下的shell有效,在子shell里无效,而hw="helloWord"作为全局环境变量,在父子shell中都有效。因此printenv不显示hh=“haha”,却显示hw=“helloWord”。
9. 默认的环境变量
可以浏览器搜索关键字Bash shell环境变量(或者 Bash shell bourne)查看,常用的也就是HOME、PATH。
10. 如何添加环境变量
Windows: 右击‘此电脑’->属性->高级系统设置->环境变量->把我们想用的命令或者应用程序的绝对路径添加进去(通常会添加到Path里),这样我们就可以在cmd里直接访问它。–使用的是配置Path环境全局域变量的方式
Linux: PATH=$PATH:想用的命令或者应用程序的绝对路径 – 缺点:只对当前shell有效
例如:
echo $PATH 里的内容等同于Windows环境变量中Path中的内容。我们Linux中设置系统级别的变量,很多时候无非就是设置PATH路径。
command not found的三种原因:①命令输错了 ②命令没安装③命令安装后没放到环境变量PATH里(只有放到PATH路径下,命令才可以被直接调用)
11. Linux中如何永久配置环境变量
了解
linux打开shell的时候,实际上是依靠启动文件来读取环境变量。linux一切皆文件,环境变量也是文件。开机的时候默认执行环境变量的文件,我们称之为启动文件。但是启动文件有好多个。
启动文件的划分依据:通过登录shell的时候划分,你怎么登录shell的,它就去读取某一个文件。例如在Ubuntu Desktop图形界面中,直接点击终端就代表登录了;server界面里可能需要login。
Bash shell:
1.登录shell
2.非登录就打开shell
3.运行脚本非交互shell
可以参看下面两个博客:
Linux 登陆shell,交互shell以及环境变量读取顺序
用户登录到shell,执行的启动文件
/etc/profile – 我们启动时最主要的一个文件。不同的发行版里该文件的内容可能也不同,所以我们想看某一个发行版上该怎么配置环境变量时,可以先用这个命令看看它代码咋写的(看bash.bashrc、profile.d等类似文件)。
bash.bashrc安装一些软件时可能会遇见,这是配置环境变量时的一个文件;还有一个是/etc/profile.d
/etc/profile、/etc/bash.bashrc、/etc/profile.d/都属于登录shell时Ubuntu系统部分的内容。类似于Windows中Path路径里的内容。
_linux不同发行版的环境变量也可能不同。因此我们不需要了解这些东西,只需要知道怎么去改。对于用户而言,不需要去碰系统层级的东西(比如像etc里面的东西),不推荐去修改它,了解一下,知道怎么去查看不同发行版的就行。实际上我们在使用时,大多数发行版中的内容都是相通的。
永久配置
不难发现.bashrc有很多我们熟悉的东西。因此在Ubuntu上配置时,只需要找到 ~/.bashrc 即可。有一些发行版可能是 ~/.bash_profile(CentOS) 或者 ~/.profile 或者 ~/.bash_login。这四个是最常见的,编辑它们得用vim。也就是说,我们只有找到这些文件去编辑它,才能真正的修改全局变量。
如果CentOS系统中 ~/.bashrc 和 ~/.bash_profile 同时存在,会优先找 ~/.bashrc 具体原因可以参看centOS源码
别名写到这些文件里也可以永久使用。
12. 入门期末作业:怎么修改全局环境变量(注意:不要把原本的环境变量删了,否则可能导致很多命令运行不了)
13. 推荐
frank的linux课教程 以上笔记全部来源于此
-----------------------------------未完待续...------------------------
---------------------------出现问题欢迎批评指正啊 ---------------------