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

news2025/3/19 15:51:43

【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.coloradmin.cn/o/2317879.html

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

相关文章

激光slam学习笔记10---ubuntu2004部署运行fastlivo2踩坑记录

背景&#xff1a;mars实验室又发福利啦&#xff01;跑跑效果&#xff0c;验了那句&#xff0c;mars出品&#xff0c;必属精品&#xff01;本人pc环境ubuntu20.04&#xff0c;基本流程按照readme走就行&#xff0c;sophus和vikit安装有些注意地方。本文做了一些部署踩坑记录&…

织梦DedeCMS优化文章模版里的“顶一下”与“踩一下”样式

测试的版本5.7.1UTF-8 一、插入<head>Js代码 将下面代码插入到文章模版里的<head>标签里 <script language"javascript" type"text/javascript" src"{dede:global.cfg_cmsurl/}/include/dedeajax2.js"></script> <…

IDEA+Docker插件一键部署SpringBoot项目到远程服务器

文章目录 1. 服务端1.1 安装Docker1.2 Docker放开远程连接1.3 重启Docker1.4 开放端口1.4.1 云端1.4.2 服务器内部防火墙指令 2.IntelliJ IDEA2.1 安装IDEA2.2 安装Docker插件2.3 SSH Configurations2.4 Docker选择对应的SSH2.5 Dockerfile2.5.1 Dockerfile2.5.2 Dockerfile Ed…

C++基础 [五] - String的模拟实现

目录 前言 string类的模拟实现 成员函数的实现 构造函数 拷贝构造函数 赋值运算符重载 析构函数 元素访问的实现 operator[ ] Iterator - 迭代器 容量大小的实现 size capacity reserve ​编辑resize 内容修改的实现 push_back append operator(char ch) …

AIAgent有哪些不错的开源平台

AIAgent领域有许多优秀的开源平台和框架&#xff0c;以下是一些值得推荐的开源平台&#xff1a; AutoGPT AutoGPT 是一个基于 OpenAI 的 GPT-4 和 GPT-3.5 大型语言模型的开源框架&#xff0c;能够根据用户给定的目标自动生成所需提示&#xff0c;并利用多种工具 API 执行多步骤…

Python刷题:流程控制(上)

今天刷的是PythonTip的Python 入门挑战中的题&#xff0c;整体难度不高&#xff0c;适合小白练手以及巩固知识点。下面会进行详细讲解。 每日一句 每一个拼命努力的人&#xff0c;都像是独自穿越黑暗森林的行者&#xff0c; 没有并肩的身影&#xff0c;唯有孤独如影随形&…

vulhub/Billu_b0x靶机----练习攻略

1.Billu_b0x靶场下载链接&#xff1a; https://download.vulnhub.com/billu/Billu_b0x.zip 2.下载后&#xff0c;解压出ova文件&#xff0c;直接拖至VMware中&#xff0c;重命名和选择存储位置&#xff0c;点击导入&#xff0c;报错点击重试即可。修改网卡为NAT模式。 打开靶…

【YOLOv8】YOLOv8改进系列(8)----替换主干网络之Swin Transformer

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f341;YOLOv8入门改进专栏&#x1f341; &#x1f341;如果再也不能见到你&#xff0c;祝你早安&#xff0c;午安&#xff0c;晚安&#x1f341; 【YOLOv8改进系列】&#xff1a; 【YOLOv8】YOLOv8结构解读…

Qwen2-Audio:通义千问音频大模型技术解读

引言:从llm到mlm(audio) 大型语言模型(LLM)的发展日新月异,它们在文本理解、生成、推理等方面展现出惊人的能力。然而,交互模态不仅仅依赖于文字,语音、语调、环境音等听觉信息同样承载着丰富的内容。阿里巴巴通义千问团队,推出了 Qwen-Audio 系列模型,这里我们一起…

解决Java多张图合成JPG时出现红色前景及多列自适应适配

目录 前言 一、追本溯源 1、回到最开始 2、合成JPG的异常 二、解决问题 1、关于ImageType 2、TYPE_INT_RGB和TYPE_INT_ARGB 3、问题修复 4、列数自适应的问题 三、总结 前言 在当今数字化信息飞速发展的时代&#xff0c;图像处理技术在各个领域都占据着举足轻重的地位…

SpringBoot实现发邮件功能+邮件内容带模版

发送简单邮件模版邮件 1.pom引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.5.13</version></dependency><dependency><groupId&…

npm 报错 unable to resolve dependency tree

如下图&#xff1a; 解决&#xff1a;npm install --legacy-peer-deps 其实提示上有&#xff1a;npm ERR! Fix the upstream dependency conflict, or retry npm ERR! this command with --force, or --legacy-peer-deps

【蓝桥杯每日一题】3.17

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x 他们说内存泄漏是bug&#xff0c;我说这是系统在逼我进化成SSR级程序员 OK来吧&#xff0c;不多废话&#xff0c;今天来点有难度的&#xff1a;二进制枚举 二进制枚举&#xff0c;就是…

Linux:冯诺依曼体系结构、操作系统、进程概念(一.初识进程)

文章目录 1.冯诺依曼体系结构总线与数据传输通路为什么有内存这个部分计算机存储结构 2.操作系统(Operator System)2.1 概念2.2 设计OS的目的2.3 理解“管理”先描述再组织 2.4 用户使用系统调用和库函数&#xff08;lib&#xff09;概念 总结 3.初识进程3.1 基本事实与引入3.2…

动手学深度学习:CNN和LeNet

前言 该篇文章记述从零如何实现CNN&#xff0c;以及LeNet对于之前数据集分类的提升效果。 从零实现卷积核 import torch def conv2d(X,k):h,wk.shapeYtorch.zeros((X.shape[0]-h1,X.shape[1]-w1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,j](X[i:ih,j:jw…

删除排序链表中的重复元素(js实现,LeetCode:83)

看到这道题的第一反应是使用快慢指针&#xff0c;之前做过类似的题&#xff1a;删除有序数组中的重复项&#xff08;js实现&#xff0c;LeetCode&#xff1a;26&#xff09;原理都是一样,区别是这题需要将重复项删除&#xff0c;所以只需要走一遍单循环就可以实现 /*** Defini…

单片机自学总结

自从工作以来&#xff0c;一直努力耕耘单片机&#xff0c;至今&#xff0c;颇有收获。从51单片机&#xff0c;PIC单片机&#xff0c;直到STM32&#xff0c;以及RTOS和Linux&#xff0c;几乎天天在搞:51单片机&#xff0c;STM8S207单片机&#xff0c;PY32F003单片机&#xff0c;…

Unity教程(二十二)技能系统 分身技能

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

HTML5扫雷游戏开发实战

HTML5扫雷游戏开发实战 这里写目录标题 HTML5扫雷游戏开发实战项目介绍技术栈项目架构1. 游戏界面设计2. 核心类设计 核心功能实现1. 游戏初始化2. 地雷布置算法3. 数字计算逻辑4. 扫雷功能实现 性能优化1. DOM操作优化2. 算法优化 项目亮点技术难点突破1. 首次点击保护2. 连锁…

【Git学习笔记】Git分支管理策略及其结构原理分析

【Git学习笔记】Git分支管理策略及其结构原理分析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Git学习笔记 文章目录 【Git学习笔记】Git分支管理策略及其结构原理分析前言一.合并冲突二. 分支管理策略2.1 分支策略2.2 bug分支2.3 删除临…