【LInux进程六】命令行参数和环境变量

【LInux进程六】命令行参数和环境变量

  • 1.main函数的两个参数
  • 2.利用main函数实现一个简单的计算器
  • 3.环境变量之一:PATH
  • 4.修改PATH
  • 5.在命令行解释器bash中查看所有环境变量
  • 6.用自己写的程序查看环境变量
  • 7.main函数的第三个参数
  • 8.本地的环境变量和环境变量
  • 9.环境变量具有全局性
  • 10.内建命令与常规命令

1.main函数的两个参数

int main(int argc , char* argv[]);

这两个参数又被称为命令行参数
char* argv[]是一个指针数组,包含的每个指针分别指向不同的字符串
int argc代表这个数组的元素个数(指针的数量)

通过下面的代码查看argv数组中存放的是什么字符串:

#include<stdio.h>      
int main(int argc,char* argv[])    
{    int i=0;                                                                                                                                                            for(i=0;i<argc;i++)    {    printf("%d: %s\n",i,argv[i]);    }    return 0;    
}   

在这里插入图片描述

当我们运行可执行程序mybin时,它会打印0: ./a.out
当我们以空格为分割在./mybin后面继续输入任意字符串时,它会以空格为分割,分别打印出数组中下标为0,1,2的字符串,这些输出的字符串正是我们所输入的
将命令行输入的字符串放入argv数组是操作系统所为

请添加图片描述

2.利用main函数实现一个简单的计算器

#include<stdio.h>    
#include<string.h>    
#include<stdlib.h>    int main(int argc,char* argv[])    
{    if(argc != 4)    {    printf("%s Option:[add|sub|mul|div] num1 num2\n",argv[0]);    return 1;    }    int x = atoi(argv[2]);    int y = atoi(argv[3]); if(strcmp(argv[1],"add") == 0)    printf("%d + %d = %d\n",x,y,x + y);    else if(strcmp(argv[1],"sub") == 0)    printf("%d - %d = %d\n",x,y,x - y);    else if(strcmp(argv[1],"mul") == 0)    printf("%d * %d = %d\n",x,y,x * y);    else if(strcmp(argv[1],"div") == 0)                                                                                                                                   printf("%d / %d = %d\n",x,y,x / y);    else    printf("输入操作符错误");    return 0;    
}    

在这里插入图片描述

3.环境变量之一:PATH

让我们思考几个问题:

  1. 为什么我们自己写的程序运行时要加./
  2. 但是系统中的指令:ls,pwd等不用加./?
  3. 我们自己写的指令能不能不加./?

我们自己写的程序要加上./的本质就是让操作系统在当前目录下寻找我们写的程序

保存程序的默认搜索路径的就是环境变量,叫做: PATH
查看环境变量PATH的指令:echo $PATH
在这里插入图片描述
这些路径以冒号:为分割
因为我们自己写的程序不在这些路径中,所以我们需要加上./来运行程序

4.修改PATH

要想我们的指令像系统指令一样不加./就能运行,我们可以将自己写的程序的路径加入到环境变量PATH中
使用指令:PATH=$PATH:要添加的路径
请添加图片描述
在这里插入图片描述

下次重启时又会恢复为默认路径,因为操作系统在登陆时会执行以下步骤:

  1. 认证用户名和密码是否正确
  2. 形成环境变量(PATH,PWD,HOME等)
  3. 根据用户名初始化HOME=/root或者HOME=/home/xxx
  4. cd $HOME(进入到自己的环境变量)

5.在命令行解释器bash中查看所有环境变量

指令:env
在这里插入图片描述
环境变量:

  1. PWD:记录当前路径,指令pwd就是调用了PWD这个环境变量在这里插入图片描述

  2. HOME:进入家目录指令:cd ~,环境变量HOME里面的内容就是家目录的位置在这里插入图片描述

6.用自己写的程序查看环境变量

使用函数:getenv()

char*  = NULL;
ret = getenv("PATH");//获取环境变量PATH

7.main函数的第三个参数

int main(int argc,char* argv[],char* env[])

第三个char* env[]是指针数组,指向了一张环境变量表,打印出来的内容和使用指令env查看的内容是一样的

查看环境变量表

#include<stdio.h>
int main(int argc,char* argv[],char* env[])
{for(int i=0;env[i]!=NULL;i++){printf("[%d]: %s"\n,i,env[i]);}return 0;
}

在这里插入图片描述
系统会给main函数提供两张表:

  1. 命令行参数表
  2. 环境变量表enü

8.本地的环境变量和环境变量

我们可以在命令行解释器bash中直接定义环境变量
指令:自己取的变量名=变量内容(=前后不能有空格)
echo $变量名指令用来打印变量
在这里插入图片描述
用户自己定义的环境变量就是本地的环境变量
用指令:env在bash中无法查找到刚才定义的本地的环境变量,因为本地变量不在环境变量表
在这里插入图片描述
使用指令:export 本地环境变量名或者export 自己取的变量名=变量内容可以把本地环境变量加入环境变量表

在这里插入图片描述

9.环境变量具有全局性

每次重新启动bash后,我们自己定义或修改的环境变量就不见了
因为我们修改的环境变量表是bash内部的,每一次重新登陆账号都会依照家目录下的.bash_profile文件中的内容重新生成命令行解释器bash
想要定义或修改被保存下来,就要把环境变量保存在家目录中的配置文件.bash_profile中(也可能是.profile文件)
在这里插入图片描述

命令行启动的进程都是shell和bash的子进程,子进程的命令行参数和环境变量都是父进程传递的
所以命令行参数表会通过main函数的参数从父进程传递给子进程

本地变量 VS 环境变量

  1. 本地变量只在bash进程内部有效,不会被子进程继承
  2. 环境变量通过让所有子进程继承的方式,实现自身的全局性

10.内建命令与常规命令

bash中的指令可以直接使用而不用加./去寻找路径,是因为它的
路径在环境变量的PATH中
当我们把环境变量中的PATH置空后,lsll指令都无法使用,但pwdecho依然正常
在这里插入图片描述

因为Linux下的指令分为两种:

  1. 常规命令:由bash创建的子进程执行的
  2. 内置命令:由bash自己执行的(父进程内部执行)

而pwd和echo就是内置命令

当我们定义的本地变量没有放入环境变量表中时,命令env都找不到这个本地变量,而命令echo却能获取到本地变量的信息,正是因为echo是内建命令,是由父进程自己执行的,echo它可以看见父进程的变化,子进程不能接受父进程的本地变量,所以由子进程执行的常规命令env获取不到本地变量的信息(命令行启动的进程都是shell和bash的子进程,而内置命令是由bash自己执行的),直到本地变量放入具有全局性的环境变量表中,由子进程继承该环境变量表中才能使用命令env查看到
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时间轴版本-2.0

文章简述 这是本人自己封装的时间轴2.0版本的代码&#xff0c;用到了TypeScriptJavaScript 这篇文章只有代码和具体的使用方式&#xff0c;如果想看具体的讲解可以参考本人写的时间轴1.0版本的&#xff0c;在1.0版本中可能计算时间线的逻辑略有不同&#xff0c;但是大致的计算…

大语言模型的压缩技术

尽管人们对越来越大的语言模型一直很感兴趣&#xff0c;但MistralAI 向我们表明&#xff0c;规模只是相对而言的&#xff0c;而对边缘计算日益增长的兴趣促使我们使用小型语言获得不错的结果。压缩技术提供了一种替代方法。在本文中&#xff0c;我将解释这些技术&#xff0c;并…

大华HTTP协议在智联视频超融合平台中的接入方法

一. 大华HTTP协议介绍 大华HTTP协议是大华股份&#xff08;Dahua Technology&#xff09;为其安防监控设备开发的一套基于HTTP/HTTPS的通信协议&#xff0c;主要用于设备与客户端&#xff08;如PC、手机、服务器&#xff09;之间的数据交互。该协议支持设备管理、视频流获取、…

Linux内核实时机制28 - RT调度器11 - RT 组调度

Linux内核实时机制28 - RT调度器11 - RT 组调度 相关数据结构 内核中通过static int sched_rt_runtime_exceeded(struct rt_rq *rt_rq)函数来判断实时任务运行时间是否超出带宽限制,判断这个运行队列rt_rq的运行时间是否超过了额定的运行时间。而“运行时间”和“额定时间”都…

java,poi,提取ppt文件中的文字内容

注意&#xff0c;不涉及图片处理。 先上pom依赖&#xff1a; <!-- 处理PPTX文件 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><!--…

7、vue3做了什么

大佬认为有何优点&#xff1a; 组合式api----逻辑集中、对ts有更好的支持RFC–开放了一个讨论机制&#xff0c;可以看到每一个api的提案&#xff0c;方便源码维护&#xff0c;功能扩展&#xff0c;大家一起讨论 官方rfc响应式独立&#xff0c;new Proxy&#xff0c;天生自带来…

多人在线聊天系统,创建群,视频,语音,自带带授权码

多人在线聊天系统&#xff0c;创建群&#xff0c;视频&#xff0c;语音 带授权码&#xff0c;授权码限制 10 个网站&#xff0c;需要下载研究吧 在线聊天&#xff0c;创建群&#xff0c;表情&#xff0c;图片&#xff0c;文件&#xff0c;视频&#xff0c;语音&#xff0c;自…

数据结构概览

关键点&#xff1a; 数据结构是组织和存储数据的方式&#xff0c;帮助高效访问和操作数据。常见类型包括数组、链表、栈、队列、树和图&#xff0c;每种都有特定用途。代码示例和实际应用场景将帮助初学者理解这些概念。 什么是数据结构&#xff1f; 数据结构就像你整理书架或…

Android studio点击运行按钮在build\intermediates\apk\debug目录下生成的apk在真机上安装失败,提示test only

Android studio点击运行按钮在build\intermediates\apk\debug目录下生成的apk在真机上安装失败&#xff0c;提示test only DeepSeek R1 思考 15 秒 思考过程 针对Android Studio生成的APK在真机安装时提示“test only”的问题&#xff0c;以下是详细解决方案&#xff1a; 1.…

NFC 碰一碰发视频源码搭建,支持OEM

一、引言 NFC&#xff08;Near Field Communication&#xff09;近场通信技术&#xff0c;以其便捷、快速的数据交互特性&#xff0c;正广泛应用于各个领域。其中&#xff0c;NFC 碰一碰发视频这一应用场景&#xff0c;为用户带来了新颖且高效的视频分享体验。想象一下&#x…

Python基础语法全解析:从入门到实践

Python作为一门简洁高效、功能强大的编程语言&#xff0c;凭借其易读性和丰富的生态系统&#xff0c;已成为编程领域的“明星语言”。本文将系统讲解Python的核心语法&#xff0c;涵盖变量、数据类型、控制结构、函数、模块等核心概念&#xff0c;帮助读者快速掌握编程基础。 一…

TypeScript中的类型断言(type assertion),如何使用类型断言进行类型转换?

一、什么是类型断言&#xff1f; 类型断言&#xff08;Type Assertion&#xff09;是 TypeScript 中一种显式指定变量类型的方式&#xff0c;它告诉编译器&#xff1a;“我比编译器更清楚这个值的类型”。​这不是运行时类型转换&#xff0c;而是编译阶段的类型声明辅助机制。…

分区表和分表

分区表&#xff08;Partitioning&#xff09; 定义 分区表是将单个表的数据按照某种规则&#xff08;如范围、列表、哈希等&#xff09;划分为多个逻辑部分&#xff0c;每个部分称为一个分区。数据仍然存储在一个物理表中&#xff0c;但逻辑上被分割为多个分区。 特点 逻辑…

C++从入门到入土(八)——多态的原理

目录 前言 多态的原理 动态绑定与静态绑定 虚函数表 小结 前言 在前面的文章中&#xff0c;我们介绍了C三大特性之一的多态&#xff0c;我们主要介绍了多态的构成条件&#xff0c;但是对于多态的原理我们探讨的是不够深入的&#xff0c;下面这这一篇文章&#xff0c;我们将…

用Maven创建只有POM文件的项目

使用 mvn 创建一个仅包含 pom.xml 文件的父项目&#xff0c;可以借助 maven-archetype-quickstart 原型&#xff0c;然后移除不必要的文件&#xff0c;或者直接通过命令生成最简的 pom.xml 文件。以下是具体操作步骤&#xff1a; 一、方法一&#xff1a;使用原型创建后清理 1…

Linux目录理解

前言 最近在复习linux&#xff0c;发现有些目录总是忘记内容&#xff0c;发现有些还是得从原义和实际例子去理解会记忆深刻些。以下是个人的一些理解 Linux目录 常见的Linux下的目录如下&#xff1a; 1. 根目录 / (Root Directory) 英文含义&#xff1a;/ 是文件系统的根…

gitee AI使用

gitee AI使用 gitee AI使用 gitee AI使用简介正文开始1. 安装openai2. 测试2.1 不使用流2.2 使用流 2.3 使用curl工具 简介 发现gitee 推出了个ai帮助多数人使用ai&#xff0c;突破算力和模型的壁垒&#xff0c;我就遵从开源精神&#xff0c;测试了下&#xff0c;希望可以帮助…

c++领域展开第十七幕——STL(vector容器的模拟实现以及迭代器失效问题)超详细!!!!

文章目录 前言vector——基本模型vector——迭代器模拟实现vector——容量函数以及push_back、pop_backvector——默认成员函数vector——运算符重载vector——插入和删除函数vector——实现过程的问题迭代器失效memcpy的浅拷贝问题 总结 前言 上篇博客我们已经详细介绍了vecto…

WPF 开发从入门到进阶(五)

一、WPF 简介与开发环境搭建 1.1 WPF 概述 Windows Presentation Foundation&#xff08;WPF&#xff09;是微软推出的用于构建 Windows 桌面应用程序的强大 UI 框架。它融合了矢量图形、动画、多媒体等多种技术&#xff0c;能让开发者创建出具有高度视觉吸引力和交互性的应用…

DICOM医学影像数据访问控制与身份验证技术应用的重要性及其实现方法详解

DICOM医学影像数据访问控制与身份验证技术应用的重要性及其实现方法详解 在现代医疗体系中,DICOM(数字成像和通信医学标准)作为医学影像数据的核心标准,扮演着至关重要的角色。随着医疗信息化的深入发展,DICOM医学影像数据的安全性和隐私保护成为医疗机构亟需解决的关键问…