当前位置: 首页 > article >正文

Linux 命令行参数 环境变量

目录

命令行参数

 概念

字段

命令行

环境变量

问题:为什么执行系统命令不用带./?

PATH

 概念

 查看环境变量的方式

env命令​编辑

main函数的第三个参数 

★C库函数:getenv()

★通过environ指针

全局变量

 本地变量

本地变量与环境变量的区别

内建命令

概念

启动时环境变量如何导入

用户级配置文件

系统级别的配置文件

重点


命令行参数

#include <stdio.h>
#include <string.h>
#include <stdlib.h>                      
int main(int argc, char* argv[])         
{                                        
    //for(int i = 0 ; i < argc; i++)//这样也行      
    //    printf("argv[i]=%s\n", argv[i]);      
    for(int i = 0; argv[i]; i++)         
        printf("argv[%d]=%s\n", i, argv[i]);      
    if(argc != 4)                        
        printf("Error\n");               
    else                                 
    {                                    
        int num1 = atoi(argv[2]), num2 = atoi(argv[3]);    
        if(!strcmp(argv[1], "add"))      
            printf("%d+%d=%d\n",num1, num2, num1 + num2);    
        if(!strcmp(argv[1], "sub"))      
            printf("%d-%d=%d\n",num1, num2, num1 - num2);                                 
        if(!strcmp(argv[1], "mul"))      
            printf("%d*%d=%d\n",num1, num2, num1 * num2);    
        if(!strcmp(argv[1], "div") && num2)    
            printf("%d/%d=%d\n",num1, num2, num1 / num2);
    }      
    return 0;
}

 概念

  • 用户在命令行中输入的以空格分割的字符串,就是命令行参数

字段

  • argc:表示传递给程序的参数个数
  • argv:字符串会存入这个字符指针数组,这个数组以NULL结尾

命令行

  • 第一个参数是要执行的程序,所以argv[0]一定不是NULL
  • 可以通过不同的选项,让一个程序执行不同的功能

环境变量

问题:为什么执行系统命令不用带./?

  • 这是一个结果,就是不用带  "./";
  • 其次,执行命令的时候会根据二进制文件,即代码和数据,来创建对应的进程
  • 猜测:系统一定会去某些地方找二进制文件

PATH

  • PATH 是一个环境变量,它定义了操作系统在命令行中搜索可执行文件的目录列表;字符串以冒号隔开
  • 操作系统会按照 PATH 变量中列出的目录顺序依次查找这个命令对应的可执行文件
  • 如果找到了就运行,没有则需输入完整路径或者相对路径
  • echo $PATH 可查看 PATH环境变量
  • 可以通过这样的方式来修改内存中PATH(内存级修改)

 概念

  • 环境变量从配置文件中读取
  • 这些环境变量仅在当前 shell 实例(当前打开的终端)中存在,因为环境变量是在进程的内存空间中保存的,当进程结束时,这些变量就会消失
  • 子进程的命令行参数和环境变量来自父进程

 查看环境变量的方式

env命令

main函数的第三个参数 

#include <stdio.h>    
int main(int argc, char* argv[], char* env[])                                                                  
{    
    for(int i = 0; env[i]; i++)    
        printf("env[%d]:%s\n", i, env[i]);    
    return 0;    
} 
  •  argc和argv写了才能加env这个参数
  • 这个代码会有警告,因为argc和argv没有用到

★C库函数:getenv()

  • 参数为环境变量名,函数在stdlib.h中
  • printf("PATH=%s\n", getenv("PATH")); 

★通过environ指针

#include <stdio.h>

int main(int argc, char* argv[], char* env[]) {
    extern char **environ; 
    for (int i = 0; environ[i]; i++) 
        printf("env[%d]:%s\n", i, environ[i]);
    return 0;
}
  • 是一个全局变量,意味着它在整个程序的所有源文件中都可以被访问,但前提是你在当前作用域中声明了它
  • 是一个指向字符串数组的指针,每个字符串表示一个环境变量
  • 不需要显式包含头文件,这是因为 environ 是一个由 C 标准库(如 glibc)提供的全局变量,而不是通过头文件声明的常规符号
全局变量
  • 它在程序的整个运行过程中存在,并且可以在程序的任何部分被访问的变量,但这并不意味着它在所有作用域中自动可见,需要声明
  • 使用的前提是声明,但是仅仅声明是使用不了的,除非 C库中有定义;
  • 编译器遇到对某个符号(变量,函数,,,)的使用时,编译器首先会在当前源文件中查找该符号的定义,若无,编译器会记录下这个未解析的符号,并在链接阶段将其传递给链接器,链接器会在其他目标文件系统库中查找这个符号的定义
  • 注意:程序不应该重新定义这些变量,因为这会与标准库中的定义冲突,导致不可预期的行为

 本地变量

  • 这些变量在当前的 shell 会话中全局有效
  • 本地变量不会继承给子进程的环境变量
  • export可以将本地变量,导出到 环境变量

本地变量与环境变量的区别

  • 本地:只在bash进程内有效,不会被子进程继承
  • 环境:通过让子进程继承的方式实现自身的全局性,系统的环境变量具有全局性

内建命令

概念

  • 内建命令是在 Shell 本身内部实现的,像是Shell内部的函数,直接在当前的 Shell 进程中运行,这些命令能够直接访问和操作 Shell 的内部状态
  • 不会创建子进程,执行风险低,由bash自己执行,可以看做bash内部的一个函数
  • 常见的内建命令:echo pwd export set unset

启动时环境变量如何导入

  • 系统启动程序的时候,给进程提供两张表1.命令行参数表2.环境变量表
  • Shell 会按照预定义的顺序加载和执行配置文件中的脚本

用户级配置文件

  • ~/.bashrc
  • ~/.bash_profile
  • ~/.profile
  • ~/.bash_logout

系统级别的配置文件

  • /etc/profile
  • /etc/bash.bashrc
  • /etc/environment
  • /etc/profile.d/*.sh

重点

  1. 重点是环境变量
  2. getenv(),environ指针
  3. 全局变量的概念
  4. 本地变量的导出,与环境变量的区别
  5. 常见的内建命令,概念
  6. 最后一个不大会

http://www.kler.cn/a/371595.html

相关文章:

  • HttpServer模块 --- 封装TcpServer支持Http协议
  • C++进阶-->多态(Polymorphism)
  • MobileNetv2网络详解
  • Springboot项目搭建的问题
  • Log4Net配置详解及输出自定义消息类示例代码
  • 【每日一题】王道 - 求序列公共元素
  • 自己动手给ESP8285 / ESP8266 1MB 编译新版AT 固件
  • 第二代支付系统报文交换标准【大额支付系统分册】(版本1.5.6)
  • 【笔记】复数基础复数相乘的物理意义:旋转+缩放
  • synchronized基本用法、原理?
  • 论文阅读 - Pre-trained Online Contrastive Learning for Insurance Fraud Detection
  • es实现自动补全
  • k8s_Pod健康检查
  • Mamba应用领域
  • 【C++】踏上C++学习之旅(四):细说“内联函数“的那些事
  • 如何实现PHP的安全最大化
  • ETF申购赎回指南:详解注意事项与低费率券商推荐!
  • 双十一我都入手了啥大件?这几款超值好物分享给你
  • c++习题36-奇数单增序列
  • 【17】 傅立叶分析
  • Java项目实战II基于Spring Boot的小型诊疗预约平台(开发文档+数据库+源码)
  • 【LeetCode热题100】链表
  • 初识算法 · 前缀和(1)
  • 使用TimeShift备份和恢复Ubuntu Linux
  • jeecgbootvue2菜单路由配置静态文件夹(public)下的html
  • 从0到1,AI我来了- (7)AI应用-ComfyUI-III-Flux模型