命令行参数和环境变量

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ## IDENT_IDENTITY: 夜神月 保持低旋律节奏 >>> [ 进入个人主页 ] <<< |
| |--------------------------------------------------------------------------------------|---|----------------------------------------------------------------------------------------| | MODULE_01 《C++ 学习》 | | MODULE_02 《Linux 学习》 | |
| SYSTEM_STATUS: STABLE // ENCRYPTION: ACTIVE |

|--------------------------------------------------------------------------------|
| |

文章目录

    • 一、命令行参数
    • 二、环境变量
    • 1.概念、实际场景
    • 2.引入Linux环境变量3-4个,拓展linux常见的环境变量
    • [3.获取、设置环境变量 命令](#3.获取、设置环境变量 命令)
    • [4、 环境变量的"生命周期"与内存本质](#4、 环境变量的“生命周期”与内存本质)
      • [4.1. 溯源:环境变量从何而来?](#4.1. 溯源:环境变量从何而来?)
      • [4.2. 初始化逻辑链("炸开"环境变量)](#4.2. 初始化逻辑链(“炸开”环境变量))
      • [4.3. 指令本质归纳(408 考点对比)](#4.3. 指令本质归纳(408 考点对比))
      • [4.4. 深度探讨:磁盘文件 vs 内存 PCB](#4.4. 深度探讨:磁盘文件 vs 内存 PCB)
        • [4.5、 总结:从符号看系统协议](#4.5、 总结:从符号看系统协议)

一、命令行参数

main函数里 存在3个命令参数

int argc 代表数组中元素的格式

char* argv[] 指针数组

char* env[] 环境变量

二、环境变量

1.概念、实际场景

W下的环境变量

  • 环境变量概念

命令行进行查找的地方、具有全局性

  • 实际场景

2.引入Linux环境变量3-4个,拓展linux常见的环境变量

bash 复制代码
[ljy@VM-0-12-centos 12-30]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ljy/.local/bin:/home/ljy/bin
bash 复制代码
[ljy@VM-0-12-centos 12-30]$ env | head -5
XDG_SESSION_ID=50065
HOSTNAME=VM-0-12-centos
SHELL=/bin/bash
TERM=xterm
HISTSIZE=3000
bash 复制代码
[ljy@VM-0-12-centos 12-30]$ echo $HOME
/home/ljy
[ljy@VM-0-12-centos 12-30]$ echo $PWD
/home/ljy/12-30
[ljy@VM-0-12-centos 12-30]$ echo $OLDPWD
/home/ljy

结论:任何进程启动时都会存在两张表,1.命令行参数表。2.环境变量表。

3.获取、设置环境变量 命令

一、 核心进程逻辑拆解

  1. -bash(会话首进程 / 进程鼻祖)
  • 角色 :它是整个登录会话的根节点(Session Leader)
  • 功能 :专门负责读取 ~/.bash_profile 并"炸开"(初始化)全局环境变量。
  • 深度理解 :它不只是"后台"的鼻祖,而是全会话进程 (包含前台与后台)的始祖。它通过操作系统底层的 fork() 系统调用产生子进程。
  1. S+ 状态下的 bash(前台代理 / 翻译官)
  • 角色 :当前正在占领终端、与用户直接交互的代理进程。
  • 功能:专门负责接收键盘输入的指令,并进行语法解析。
  • 关键标识 :状态位中的 + 代表前台进程组 。在 Linux 逻辑中,只有带 + 的进程才能直接"吃"到你从键盘敲进去的指令。

二、 思维补丁:系统逻辑闭环

  1. 数据流向图

键盘输入 → \rightarrow → 终端设备 (TTY) → \rightarrow → S+ 状态的 bash (解析器) → \rightarrow → 执行具体指令

  1. 环境变量的"遗传学"
  • 初始化-bash 启动时通过读取配置文件划定"疆域"。
  • 继承性-bash 初始化的变量,会被其派生的 S+ 状态子 bash 完美继承,无需重复读取。

三、 考研模式总结(金句摘要)

"-" 标定血缘与初衷(初始化环境);
"+" 标定权力与交互(掌控前台输入)。


[温故知新:408 考点关联]

在操作系统中,进程状态的切换(S、R、Z等)是核心考点。理解了 + 号代表前台组,就理解了为什么

环境变量的由来

每一次登录linux的时候,操作系统都会为我们提供一个bash进程,这个bash进行是所有前后端的鼻祖。用于命令解析,且是死循环。

它的逻辑是

bash-> ~ /.bash_profile->~/.bashrc->/etc/bash->*

从而获取环境变量。

4、 环境变量的"生命周期"与内存本质

4.1. 溯源:环境变量从何而来?

每当你登录 Linux 时,系统会自动创建一个 -bash 进程。这个进程是所有前后端程序的鼻祖 ,其核心逻辑是一个持续运行的死循环,专门用于命令解析。

4.2. 初始化逻辑链("炸开"环境变量)

-bash 启动后,会按照以下逻辑顺序层层读取配置文件:

-bash → \rightarrow → ~/.bash_profile → \rightarrow → ~/.bashrc → \rightarrow → /etc/bashrc → \rightarrow → 获取完整环境

4.3. 指令本质归纳(408 考点对比)

指令 操作本质 408 考研逻辑映射
echo 读取变量值 进程内存读取:从 PCB 环境变量区获取数据并输出。
export 新增/提升变量 PCB 动态扩展:在进程控制块中新增环境变量条目,并标记为可继承。
env 显示环境变量 环境表快照:只显示 PCB 中会被子进程继承的"全局变量"。
set 显示所有变量 全集观察:显示当前 Shell 的环境变量 + 局部变量 + 函数定义。
unset 删除变量 内存销毁:从当前进程的环境变量表中抹除指定条目。

4.4. 深度探讨:磁盘文件 vs 内存 PCB

  • 持久化逻辑 :在 ~/.bash_profile 中修改环境变量,本质是修改磁盘上的静态配置文件
  • 运行期逻辑export 动作本质是在**进程控制块(PCB)**内存空间中动态新增/修改数据。
  • 生效机制 :配置文件仅在登录瞬间被加载;若要在运行中同步磁盘修改,必须使用 source 命令将静态配置"注入"到内存 PCB 中。

4.5、 总结:从符号看系统协议
  • "-" (登录位):标定血缘与初衷。代表它是从磁盘读取配置、初始化环境的"创世进程"。
  • "+" (前台组):标定权力与交互。代表它拥有当前 TTY 终端的控制权,是直接吞吐用户指令的代理。

[408 考研划重点]

理解环境变量的继承性是掌握 fork()exec() 系统调用的前提。子进程继承的是父进程环境变量的副本(基于写时复制技术),这种设计保证了进程间环境的相对隔离与安全性。

相关推荐
别多香了8 小时前
系统批量运维管理器 paramiko
linux·运维·服务器
习惯就好zz8 小时前
在 Ubuntu 18.04 旧系统上部署新版 GitHub Actions Runner 的终极方案
linux·ubuntu·github·cicd·action
杨云龙UP8 小时前
Linux LVM 在线扩容标准操作流程_20260102
linux·运维·服务器·centos·ux
微凉的衣柜8 小时前
Windows Server 使用 Nginx 反向代理实现域名访问内网 Gradio 应用
运维·windows·nginx
warton888 小时前
ubuntu24.04 安装mysql8.0.36
linux·运维·mysql
运维有小邓@8 小时前
如何实现基于角色的访问控制?
运维·网络
范纹杉想快点毕业8 小时前
嵌入式通信核心架构:从状态机、环形队列到多协议融合
linux·运维·c语言·算法·设计模式
小龙8 小时前
【Git 报错解决】SSH 公钥认证失败(`Permission denied (publickey)`)
运维·git·ssh
白驹过隙^^8 小时前
VitrualBox及ubuntu系统安装
linux·运维·ubuntu
可爱又迷人的反派角色“yang”8 小时前
k8s(一)
linux·运维·网络·云原生·容器·kubernetes