11-2 环境是如何建立的
二、环境是如何建立的
用户登录系统后,bash 程序就会启动并读取一系列称为启动文件的配置脚本,这些脚本定义了所有用户共享的默认环境。 接下来,bash 会读取更多存储在主目录下的用于定义个人环境的启动文件。 这些步骤执行的确切顺序是由启动的 shell 会话类型决定的。 (准)
1.shell 会话的 2 种类型
shell 会话存在两种类型,分别为 login shell 会话和 non-login shell 会话。 login shell 会话会提示用户输入用户名和密码,如虚拟控制台会话。 而我们在 GUI 中启动的终端会话就是一个典型的 non-login shell 会话。 (准)
(1)login shell会话
会提示用户输入用户名和密码。 login shell 会话会读取一个或多个启动文件。
① login shell 的启动文件
文件 |
说明 |
---|---|
/etc/profile |
适用于所有用户的全局配置脚本。 |
~/.bash_profile |
用户的个人启动文件。可 扩展 或 重写 全局配置脚本中的设置。 |
~/.bash_login |
若 ~/.bash_profile 缺失,则 bash 尝试读取此脚本。 |
~/.profile |
若 ~/.bash_profile 缺失 与 ~/.bash_login 均缺失,则bash 尝试读取此脚本。在基于 Debin 的Linux版本中(比如Ubuntu),这是默认值。 |
(准)
(2)non-login shell会话
在 GUI 中启动的终端会话。
① non-login shell 的启动文件
文件 |
说明 |
---|---|
/etc/bash.bashrc |
适用于所有用户的全局配置脚本。 |
~/.bashrc |
用户的个人启动文件。可 扩展 或 重写 全局配置脚本中的设置。 |
② non-login shell继承父类进程的环境
在读取以上启动文件之外,non-login shell还会继承父类进程的环境,父类进程通常是一个 login shell。 用户可查看本机系统有哪些启动文件,需要注意的是,这些文件大多数以“ . ”开头(这意味着这些文件是被隐藏的),所以用户在使用 ls 命令时需要伴随使用 -a 选项。
③ ~/.bashrc文件
在普通用户看来 ~/.bashrc 可能是最重要的启动文件,因为系统几乎总是要读取。non-login shell 会默认读取 ~/.bashrc ,而大多数login shell 的启动文件也能 以读取 ~/.bashrc 文件的方式来编写。
2.启动文件中有什么?
(1)PATH变量
① 是什么?
PATH变量通常是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到哪些目录下去寻找。 PATH 变量是由启动文件 /etc/profile 中的一段代码设定(当然,这也并不总是如此,这取决于系统的发行版本)。
② 为什么?
指定命令搜索路径。 当在命令行输入一条命令后,shell 是如何找到这些命令的呢? 比如说,当我输入命令 ls ,shell 不会搜索整个系统文件来寻找 /bin/ls(这是 ls 命令的完整路径名),而是会搜索 PATH 变量中存储的目录列表。
③ 参数扩展的机理
在了解怎么做之前,先来看看参数扩展的机理,借助以下代码理解参数扩展(参数扩展在第7章讲过)的机理:
foo="This is some"
echo $foo
foo=$foo" text."
echo $foo
使用参数扩展,用户可将更多的内容添加到变量值的尾部。
④ 怎么做?
PATH=$PATH:$HOME/bin
上面这段代码,将 $HOME/bin 添加到了 PATH 值的尾部。这是一个参数扩展的实例。 在把字符串
HOME/bin这个路径就会处于被搜索的路径列表中。这就意味着,当我们想在主目录下创建名为 bin 的目录,并在此目录中存放自己的私有程序时,shell 已经为我们准备好了,我们只需将创建的目录称之为 bin 即可。
export PATH
最后一行是如上代码,该 export 命令告诉 shell ,使得 shell 的子进程使用PATH变量的内容。
⑤ 注意
很多 Linux 发行版本在默认情况下提供了该 PATH 设置。一些基于 Debian 的发行版本,如 Ubuntu ,会在登录时检查 ~/bin 目录是否存在,若存在,就会自动将其添加到PATH变量中。
- 用搜索神器Everything定位Webshell木马后门
- 终端图像处理系列 - OpenGL ES 2.0 - 3D基础(矩阵投影)
- XssHtml – 基于白名单的富文本XSS过滤类
- fireeyee解剖新型Android恶意软件
- WordPress系统暴力破解测试工具 – wpbf
- RecyclerView notifyItem闪烁的问题
- 独家: iOS是如何收集用户的地理信息的
- Hygieia 为何物?DevOps 利器也
- 汽车攻击离你很近:一分钟变成汽车黑客
- LIFX智能灯泡漏洞泄露WIFI密码
- android ViewPager+Fragment之懒加载
- 逆向APK进行smali注入实现“秒破WIFI”
- 我所理解的Android 启动模式
- 搭建开源入侵检测系统Snort,并实现与防火墙联动
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
- 基于python实现模拟数据结构模型
- keras的siamese(孪生网络)实现案例
- 浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
- Python数据可视化图实现过程详解
- Python matplotlib 绘制双Y轴曲线图的示例代码
- keras 读取多标签图像数据方式
- python新手学习可变和不可变对象
- COS Android SDK DEMO搭建实践
- 利用COS多版本避免文件误删除
- kube-prometheus添加target
- 深入浅析python 中的self和cls的区别
- php中如何执行linux命令详解
- Linux下 php7安装redis的方法
- 基于Keras中Conv1D和Conv2D的区别说明