linux笔记7--环境变量

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课教程 以上笔记全部来源于此

-----------------------------------未完待续...------------------------
---------------------------出现问题欢迎批评指正啊 ---------------------

相关推荐

  1. Linux环境变量export命令笔记231207

    2024-06-12 12:36:05       70 阅读
  2. linux设置环境变量

    2024-06-12 12:36:05       58 阅读
  3. Linux环境变量

    2024-06-12 12:36:05       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-12 12:36:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-12 12:36:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-12 12:36:05       87 阅读
  4. Python语言-面向对象

    2024-06-12 12:36:05       96 阅读

热门阅读

  1. Web前端开发群聊:深入探索、交流与实践

    2024-06-12 12:36:05       32 阅读
  2. 常见的数据寻址方式

    2024-06-12 12:36:05       31 阅读
  3. 【C语言】32个关键字

    2024-06-12 12:36:05       26 阅读
  4. net core json 转换帮助类 JsonHelper

    2024-06-12 12:36:05       30 阅读
  5. 扩展知识:RocketMQ 如何开启 ACL 验证

    2024-06-12 12:36:05       27 阅读
  6. [python]yfinance国内不能使用

    2024-06-12 12:36:05       34 阅读
  7. Web前端设置技巧:深度解析与优化实践

    2024-06-12 12:36:05       22 阅读