命令⾏参数和环境变量

1.命令⾏参数

命令行参数是 在程序运行时通过命令行传递给程序的参数 ,允许用户在不修改代码的情况下控制程序的行为。

main函数可以有参数吗?

比如ls -l

2.环境变量

2.1概念

环境变量是 操作系统中用于存储系统配置信息的键值对 ,它为程序提供运行时的全局配置信息,避免了将配置硬编码到程序中。

如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪

⾥,但是照样可以链接成功,⽣成可执⾏程序,原因就是有相关环境变量帮助编译器进⾏查找。
2.2常⻅环境变量

• PATH:指定命令的搜索路径

• HOME:指定⽤⼾的主⼯作⽬录(即⽤⼾登陆到Linux系统中时,默认的⽬录)

• SHELL:当前Shell,它的值通常是/bin/bash。
2.3简单的环境变量罗列

问题

操作系统要执行我的命令在哪里找?

查找可执行命令是在PATH中查找的

在/usr/bin/ls路径下,PATH包含这个路径

证明:

查看环境变量⽅法?

echo $NAME //NAME:你的环境变量名称

2.4如何获取环境变量

1.命令⾏第三个参数

2.通过函数获得单个环境变量

getenv

3.通过第三⽅变量environ获取

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头⽂件中,所以在使⽤时要⽤

extern声明。

cpp 复制代码
#include <stdio.h> 
int main(int argc, char *argv[])
{
extern char **environ;
int i = 0;
for(; environ[i]; i++){
printf("%s\n", environ[i]);
}
return 0;
}

2.5我的进程是怎么获得环境变量的

并不是我的进程获得环境变量,而是父进程获得了环境变量,子进程继承了

父进程中有两张表,一张环境变量表(比较稳定),一张命令行参数表(一直在变)

父进程是从bash中获取的,而bash是从系统的配置文件中来/.bash_profile?&&?/.bashrc修改⽂件级环境变量
2.6为什么要有环境变量?

不同的环境变量有不同的作用

eg:

补充:

环境变量不是全部都来自系统的配置文件,有的是系统动态获取的

eg;pwd

1. 方式1:通过环境变量PWD获取

复制代码
#include <stdlib.h>
#include <stdio.h>

int main() {
    char *pwd = getenv("PWD");
    if (pwd) {
        printf("当前目录(通过PWD): %s\n", pwd);
    }
    return 0;
}

特点 :

  • ✅ 速度快 :直接从内存读取环境变量
  • ❌ 不可靠 :如果环境变量没有及时更新,会得到错误结果
  • ❌ 易被篡改 :用户可以手动修改 PWD 环境变量

2. 方式2:使用系统调用getcwd(推荐)

复制代码
#include <unistd.h>
#include <stdio.h>

int main() {
    char buf[128];
    char *pwd = getcwd(buf, sizeof(buf));
    if (pwd) {
        printf("当前目录(通过getcwd): %s\n", pwd);
    }
    return 0;
}

特点 :

  • ✅ 可靠 :直接从内核获取进程的真实工作目录
  • ✅ 实时性 :始终返回当前实际工作目录
  • ✅ 标准接口 :跨平台兼容(Linux/UNIX/Windows)

所以pwd先从系统调用获取在修改环境变量

2.7环境变量的特点和总结

环境变量具有全局性,会被子进程继承eg:export key = 110;

本地变量不具有全局性,不会被子进程继承,但echo可以获取,因为echo是内置命令,自己执行eg key =110;

  1. echo:显⽰某个环境变量值
  2. export:设置⼀个新的环境变量
  3. env:显⽰所有环境变量
  4. unset:清除环境变量
  5. set:显⽰本地定义的shell变量和环境变量
相关推荐
用户029266661337 小时前
Linux 用户管理知识与应用实践(三:用户组及修改用户密码)
linux
Mortalbreeze7 小时前
深入 Linux 线程机制(三):线程互斥——竞争条件与互斥锁的本质
linux·运维·服务器·c++·算法
鱼听禅8 小时前
CentOS 源码模式配置SVNAdmin2管理SVN仓库
linux·svn·centos
Amonter8 小时前
RK3399ProD移植主线Linux内核
linux·rockchip·rk3399pro
say_fall8 小时前
【Git 精品详解】企业规范:企业级开发模型、Git Flow、发版流程规范、Code Owner 制度、事故应急回滚
大数据·linux·服务器·git·学习·elasticsearch
一杯奶茶¥9 小时前
Ubuntu系统镜像各个版本下载Ubuntu镜像合集资源Linux系统镜像乌班图Linux系统镜像
linux·运维·ubuntu·镜像·;inux镜像·ubuntu镜像
三84418 小时前
文件查找/文件压缩/解压缩
linux·运维·服务器
小猪写代码18 小时前
Linux 管道(Pipeline)作业
linux·运维·服务器
会周易的程序员20 小时前
microLog 的本地日志读取接口 log_reader — 本地日志文件读取工具开发指南
linux·物联网·架构·嵌入式·日志·iot·aiot
yoothey21 小时前
报废审批流规则引擎设计——责任链模式完整实现
linux·开发语言·bash