linux笔记7--环境变量

文章目录

  • [1. 什么是环境变量](#1. 什么是环境变量)
  • [2. 环境变量的划分](#2. 环境变量的划分)
  • [3. 用户和局部变量的设定](#3. 用户和局部变量的设定)
  • [4. 定义全局变量](#4. 定义全局变量)
  • [5. 注意](#5. 注意)
  • [6. 删除自己定义的全局变量、局部变量:](#6. 删除自己定义的全局变量、局部变量:)
  • [7. printenv](#7. printenv)
  • [8. 问题残留](#8. 问题残留)
  • [9. 默认的环境变量](#9. 默认的环境变量)
  • [10. 如何添加环境变量](#10. 如何添加环境变量)
  • [11. Linux中如何永久配置环境变量](#11. Linux中如何永久配置环境变量)
  • [12. 入门期末作业:怎么修改全局环境变量(注意:不要把原本的环境变量删了,否则可能导致很多命令运行不了)](#12. 入门期末作业:怎么修改全局环境变量(注意:不要把原本的环境变量删了,否则可能导致很多命令运行不了))
  • [13. 推荐](#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课教程 以上笔记全部来源于此

-----------------------------------未完待续...------------------------
---------------------------出现问题欢迎批评指正啊 ---------------------
相关推荐
wenyue11216 分钟前
Ease Monitor 会把基础层,中间件层的监控数据和服务的监控数据打通,从总体的视角提供监控分析
运维·中间件·监控
量子网络12 分钟前
debian 如何进入root
linux·服务器·debian
时光の尘16 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
我们的五年20 分钟前
【Linux课程学习】:进程描述---PCB(Process Control Block)
linux·运维·c++
-一杯为品-25 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
运维老司机43 分钟前
Jenkins修改LOGO
运维·自动化·jenkins
D-海漠1 小时前
基础自动化系统的特点
运维·自动化
我言秋日胜春朝★1 小时前
【Linux】进程地址空间
linux·运维·服务器
C-cat.1 小时前
Linux|环境变量
linux·运维·服务器
yunfanleo2 小时前
docker run m3e 配置网络,自动重启,GPU等 配置渠道要点
linux·运维·docker