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

【Linux】命令行参数 | 环境变量

 🪐🪐🪐欢迎来到程序员餐厅💫💫💫

          主厨:邪王真眼

主厨的主页:Chef‘s blog  

所属专栏:青果大战linux

总有光环在陨落,总有新星在闪烁


前几天在搞硬件,所以拖更了,现在基本完成,于是立刻投入了Linux的怀抱

main的参数

我们c语言学习的第一段代码那一定是hello,world,之后我们在此基础之上,不断地学习着。

 include<stdio.h>  int main(){  printf("hello,world\n");                                                                                                                                                                                                    } 

想必大家都知道main本质也是一个函数,他也像上面那样显示的一样,是个没有形参的函数。

、、、还是说,并不是这样!

某些小伙伴可能见过main下面这种用法

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

这里出现了两个参数,一个int整型,一个指针数组,而他们就是我们在linux中能够使用命令的关键。

我们对代码进行加工,

#include<stdio.h>
#include<string.h>
int main(int argc ,char* argv[]){printf("argc:%d\n",argc);if(argc!=2){printf("格式错误\n");}else {if(strcmp(argv[1],"-a")==0)printf("功能a\n");else if(strcmp(argv[1],"-b")==0)printf("功能b\n");else  if(strcmp(argv[1],"-c")==0)printf("功能c\n");else{printf("其他功能\n");}}
}

我知道,你很急,但你先别急,马上解惑

在我们像以往一样直接./test1.exe运行文件,输出如下

argc的值是1.并告诉我们格式错误。接着我们像指令一样,加入“-a”“-b”,“-c”选项,输出如下

 这时敏锐的朋友就已经意识到了,我们在命令行所使用的命令及其对应的选项,就是用的main函数带参数的方法!

我们在命令行输入一条语句,他会被按照空格进行分割,像上面的“./test1.c -a”,就会被分成两个参数,argc所存储的就是参数的个数,所有参数都会被以字符串的形式从左到右依次放到argc数组中,该数组最后一个元素是NULL,所以也可以这么写

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

在此基础之上,我们不禁好奇,分割这个字符串的是谁呢,显然他不是该可执行程序,因为这段代码从main函数才开始运行,但是分割字符串是发生在调用main之前的(不然没法传参)

要知道我们在命令行所启动的程序,不论是指令也好,是自己写的代码也罢,他们的父进程是唯一且确定的,即shell,他们互为父子进程,因此我们不难推测就是bash分割了字符串,接着以main函数传参的方式把数据传给了我们的test3.exe,至于具体怎么操作的,我们以后再说

我叮嘱一下,这个main函数的参数不是说一定要写为argc和argv,只是我们普遍这样写,你要是非要写成int a和char*b[]也是没问题的。


环境变量

事实上,main函数有三个参数,第三个就是环境变量,我们来展示一下

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

我们一运行文件,就打印出一大堆字符串,他们就是环境变量。

环境变量的概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数

我们来讲解几个常见的环境变量 

  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • SHELL : 当前Shell的路径,它的值通常是/bin/bash。
  • USER:当前正在使用系统的用户是谁
  • HOME:当前用户的家目录在哪
  • PWD:当前路径

关于PATH

        我们在使用指令时直接输入指令名称和选项即可,但是在运行自己写的可执行文件时,需要在他前面加上相对路径或者绝对路径。这就是PATH的作用,PATH是多个路径拼接而成的字符串由“:”作为分隔符,在运行可执行文件时,如果没有带路径,会先在PATH中查找,看该文件是否在这些路径中,如果有就可以运行,如果没有则相当于找不到该可执行文件,就无法执行。而指令的绝对路径包含在PATH中,因此可以不待路径直接运行。 


查看环境变量

  • echo$+名称

  •  getenv查看环境变量

输入一个环境变量名,他会返回该环境变量的值,包含在stdlib.h中

注意不可以查看本地变量

#include<stdio.h>
#include<stdlib.h>
int main(){printf("%s\n",getenv("PATH"));printf("%s\n",getenv("a"));}

  •  指针数组

enviorn,是一个外部变量,这是c语言提供的,我们直接加extern声明即可

#include<stdio.h>
#include<unistd.h>
extern char**environ;
int main(){
int i=0;while(environ[i])printf("%s\n",environ[i++]);
}

  • env指令 

显示所有环境变量

  • set指令

显示所有环境变量和本地变量


 修改环境变量

PATH=xxx即可

不过此时我们会发现指令无法使用了,这是因为之前的那些路径被现在的覆盖了如果是想在原路径的基础上进行添加只需要先退出xshell(恢复到原本的PATH)再PATH=$PATH:xxx即可

 我们修改了PATH这个环境变量,但是一关闭xshell,再开启,PATH的值就恢复成原来的样子了,我们对他的修改没有在关闭后保存。于是我们可以推测这些环境变量是存在于内存中的。就像我们c语言可以malloc一样,程序在启动时开辟一段内存空间,从父进程继承环境变量。父进程的环境变量则是由父进程的父进程传递来的。其最终源头,是一份系统配置文件,存储在硬盘中,掉电不丢失,当我们登录账号时,会启动shell进程,他会从该文件中读取相关信息并开辟空间进行存储,组成自己的环境变量表,而shell是所有进程的父进程,因此别的进程就可以从他这里继承环境变量了。在用户目录下,有两个隐藏文件。就是我们说的系统配置文件。


设置与取消环境变量

a=100

我们用echo查一下

本质是你的shell会把这个字符串记录下来,并为他开辟一片空间,于是echo查询的时候就会查到他,这种变量叫做本地变量,这种变量无法被子进程继承

想要把本地变量转化为环境变量,只需要export+本地变量名,就可以了

也可以在定义时写为

export a=10

取消环境变量和本地变量unset 变量名


-------------很好,关于环境变量就算是讲完了,觉得有用的话,还请关注一下作者吧。-------------

相关文章:

【Linux】命令行参数 | 环境变量

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 前几天在搞硬件&…...

python 使用进程池并发执行 SQL 语句

这段代码使用了 Python 的 multiprocessing 模块来实现真正的并行处理&#xff0c;绕过 Python 的全局解释器锁&#xff08;GIL&#xff09;限制&#xff0c;从而在多核 CPU 上并发执行多个 SQL 语句。 from pyhive import hive import multiprocessing# 建立连接 conn hive.…...

我也谈AI

“随着人工智能技术的不断发展&#xff0c;我们已经看到了它在各行业带来的巨大变革。在医疗行业中&#xff0c;人工智能技术正在被应用于病例诊断、药物研发等方面&#xff0c;为医学研究和临床治疗提供了新的思路和方法&#xff1b;在企业中&#xff0c;人工智能技术可以通过…...

算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝

大佬们好呀&#xff0c;这一次讲解的是二叉树的深度搜索&#xff0c;大佬们请阅 1.前言 ⼆叉树中的深搜&#xff08;介绍&#xff09; 深度优先遍历&#xff08;DFS&#xff0c;全称为DepthFirstTraversal&#xff09;&#xff0c;是我们树或者图这样的数据结构中常⽤的⼀种…...

编写第一个 Appium 测试脚本:从安装到运行!

前言 最近接到一个测试项目&#xff0c;简单描述一下&#xff0c;需求就是&#xff1a;一端发送指令&#xff0c;另一端接受指令并处理指令。大概看了看有上百条指令&#xff0c;点点点岂不是废了&#xff0c;而且后期迭代&#xff0c;每次都需要点点点&#xff0c;想想就头大…...

mysql查表相关练习

作业要求&#xff1a; 单表练习&#xff1a; 1 . 查询出部门编号为 D2019060011 的所有员工 2 . 所有财务总监的姓名、编号和部门编号。 3 . 找出奖金高于工资的员工。 4 . 找出奖金高于工资 40% 的员工。 5 找出部门编号为 D2019090011 中所有财务总监&#xff0c;和…...

airtest+poco多脚本、多设备批处理运行测试用例自动生成测试报告

一&#xff1a;主要内容 框架功能、框架架构及测试报告效果 airtest安装、环境搭建 框架搭建、框架运行说明 框架源码 二&#xff1a;框架功能及测试报告效果 1. 框架功能&#xff1a; 该框架笔者用来作为公司的项目的前端自动化&#xff0c;支持pc和app&#xff0c;本文…...

Prometheus套装部署到K8S+Dashboard部署详解

1、添加helm源并更新 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update2、创建namespace kubectl create namespace monitoring 3、安装Prometheus监控套装 helm install prometheus prometheus-community/prome…...

python使用pymysql

为了封装这个数据库操作为一个通用方法&#xff0c;我们可以创建一个函数&#xff0c;该函数接受数据库连接参数&#xff08;如主机名、用户名、密码、数据库名&#xff09;、SQL语句以及必要的参数&#xff08;用于参数化查询&#xff09;。下面是一个简单的封装示例&#xff…...

Vue3 + TypeScript 组件和文件命名规范及 setup 导入顺序规范

前言 在 Vue3 项目中&#xff0c;合理的文件命名规范和导入顺序不仅有助于提高代码的可读性&#xff0c;还能增强团队协作的效率。特别是在使用 TypeScript 和 Composition API 的项目中&#xff0c;清晰的组件和文件结构尤为重要。本文将详细介绍 Vue3 TypeScript 项目中的组…...

netty之处理连接源码分析

写在前面 在这篇文章看了netty服务是如何启动的&#xff0c;服务启动成功后&#xff0c;也就相当于是迎宾工作都已经准备好了&#xff0c;那么当客人来了怎么招待客人呢&#xff1f;也就是本文要看的处理连接的工作。 1&#xff1a;正文 先启动源码example模块的echoserver&a…...

Dockerfile文件编写

1、打nginx原始包 登录后复制 ROM nginxENV LANG zh_CN.UTF-8 ENV LC_ALL zh_CN.UTF-8 ENV TZ Asia/Singapore# 设置时区&#xff0c;同样保持在一层 RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && \echo "${TZ}" > /etc/timezoneRUN apt-get …...

Oracle SQL 使用 ROWNUM 分页查询速度太慢的问题及解决方案!

在使用 Oracle 数据库进行数据查询时,分页查询是一种常见的需求。传统上,开发者常常使用 ROWNUM 来实现分页功能。 然而,当数据量较大时,使用 ROWNUM 进行分页查询可能会导致性能问题。本文将深入探讨这一问题的原因,并提供多种解决方案,以提高分页查询的性能。 一、RO…...

Django3 + Vue.js 前后端分离书籍添加项目Web开发实战

文章目录 Django3后端项目创建切换数据库创建Django实战项目App新建Vue.js前端项目 Django3后端项目创建 创建Django项目&#xff0c;采用Pycharm或者命令行创建皆可。此处&#xff0c;以命令行方式作为演示&#xff0c;项目名为django_vue。 django-admin startproject djang…...

楼梯区域分割系统:Web效果惊艳

楼梯区域分割系统源码&#xff06;数据集分享 [yolov8-seg-FocalModulation&#xff06;yolov8-seg-GFPN等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al l…...

Day10加一

给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 class Solution {public int[] plusOne(int[] di…...

UTF-8简介

UTF-8 UTF-8&#xff08;8-bit Unicode Transformation Format&#xff09;是一种针对Unicode的可变长度字符编码&#xff0c;也是一种前缀码。它可以用一至四个字节对Unicode字符集中的所有有效编码点进行编码&#xff0c;属于Unicode标准的一部分&#xff0c;最初由肯汤普逊…...

基于Openwrt系统架构,实现应用与驱动的实例。

一、在openwrt系统架构&#xff0c;编写helloworld的应用程序。 第一步先创建目录&#xff0c;项目代码要放在 openwrt根目下的 package 目录中&#xff0c;这里源码写在了 hellworld 的 src 目录下&#xff0c;因为外层还有需要编写的文件。 mkdir -p ~/openwrt/package/hel…...

SQL进阶技巧:如何利用三次指数平滑模型预测商品零售额?

目录 0 问题背景 1 数据准备 2 问题解决 2.1 模型构建 (1)符号规定 (2)基本假设...

HTB:Cicada[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机进行开放端口扫描 使用nmap对靶机开放端口进行脚本、服务信息扫描 首先尝试空密码连接靶机SMB服务 由于不知道账户名&#xff0c;这里我们使用crackmapexec对smb服务进行用户爆破 通过该账户连接至靶机SMB服务器提取敏感信…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...