命令行参数、环境变量详解

news2024/9/27 21:30:50

目录

一、命令行参数:

二、环境变量PATH

1、理解什么是环境变量

2、常见环境变量和操作

3、整体理解环境变量,系统,程序

4、如何获取环境变量(c语言)

(1)getenv() 函数

(2)使用 extern char **environ

5、内建命令

特点和用法


一、命令行参数:

我们常写的main函数是可以带参数的

int main(int argc, int argv[],int )
{
    //...
    return 0;
};

当我们在命令行输入带有main函数的程序时,
可以在程序的后面输入一些值
如图:

makefile文件:

 myprocess:myprocess.c                                                                                                        
  2   gcc -o myprocess myprocess.c -std=c99 
  3 
  4 .PHNOY:clean
  5 clean:
  6   rm -f myprocess
~

c文件:

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

当你输入n个值,argc的大小就是n
对应的,就会开辟一个大小为n的argv数组
argv数组的最后一个位置是NULL
第一个位置argv[0]一定是程序名
那么这个有什么用处呢?

其实我们输入的命令行,本质是一行字符串:
这一行字符串的意义: 程序的路径 + 名称 和 该进程匹配的选项
例如:

ls -l
ls -a
ls -d
ls -dla
….

ls本质是一个程序,后面的-x代表这个程序的不同的功能
你在命令行输入ls
本质上和你自己执行一个自己写的 ./xxx.c 可执行程序没有任何区别

因此,为什么有命令行参数:
命令行参数的本质是交给我们程序的不同选项,用来定制不同的程序功能,程序命令中会携带很多选项

父进程的数据,默认能被子进程看到并访问
且命令行中启动的程序,都会变成进程,其实都是bash的子进程
因此,我们平常在命令行中输入的命令,就是默认输入给bash父进程的
而bash就叫做命令行解释器
因此,bash就会把输入的字符串解释成对应的信息表
而子进程是可以看到父进程的信息的
因此,父进程就可以把对应的参数,初始化为argc,和argv[],再传给对应的子进程执行

二、环境变量PATH

1、理解什么是环境变量

可是,为什么我们在运行自己的程序时,必须加上./
执行ls pwd等程序却不需要呢?
而执行程序,首先要找到命令的所在位置,然后加载到内存中,再运行
所以,我们可以这样理解:
ls等命令不需要路径,是不是因为bash已经知道了这个程序的路径呢?
而且这个路径以某种形式默认着
而我们自己写的程序,因为没有这种默认,所以bash不认识,所以必须要指明路径
是不是这个原因呢?
是的,没错,就是如此
而这个默认的形式,就是环境变量,PATH

在Linux中,存在一些全局的设置,这些设置告诉命令行解释器,应该去哪些路径寻找可执行程序
这样,就不需要专门的再加上一个./路径
PATH是一个一系列路径的组合:

在执行一个程序时,如果这个命令在PATH的默认路径上逐个搜寻,如果找到了
就直接加载到内存并执行
如果没有找到,就提示找不到命令

这也就是为什么,当你输入一个字符串命令的时候
本质上其实是输入一个程序
这个字符串要被bash命令行解释器解释,这也就是为什么bash叫做命令行解释器
解释的过程,其实就是在环境变量设置的默认路径中,寻找对应程序的过程
如果找不到对应的程序
这个时候,命令行就会提示如下:

找不到命令行,这就是原因!

查看环境变量:

echo $PATH

(我这里用的是root用户,我们在使用自己的操作系统时,尽量不要使用root用户,因为权限太高,容易出事情)

那么,如果,我的程序也要像系统命令一样,不需要./就可以直接运行
怎么办?
很简单,比较简单粗暴的做法就是,直接cp我们的程序到/usr/bin/路径下

cp XXX /usr/bin/ 

这样,就可以像系统命令一样直接运行了

例如:当我把我的可执行文件直接拷贝到/usr/bin环境变量路径下,我就可以直接像执行命令一样,直接运行我自己写的文件。

但是强烈不建议这样做
因为会污染系统的指令集
但是事实上,这种环境变量只是一个内存级别的
什么意思?
当系统退出后,操作系统数据和代码退出内存,那么你的设置也就随之消失了
这也就说明,最开始的环境变量并不是保存在内存中,而是存在操作系统的配置文件中
每一加载Linux操作系统,都会读取加载操作系统的配置文件的内容
所以,你在修改PATH的时候,修改的只是内存中的运行备份
而没有修改操作系统的配置文件的内容

那么,配置文件在哪里
在家目录下的:
bash_profile
bashrc
/etc/bashrc

那么,到底怎么加呢?
千万不敢这样加:
PATH = 某某某路径
这会导致,你直接篡改了整个环境变量,把原来系统的默认路径都直接修改了
这样,你原来的系统命令都不能用了
应该这样加:

PATH = $PATH:/某某路径

因此,PATH是Linux下默认查找程序命令和路径,也是which查找命令指令的默认路径

2、常见环境变量和操作

查看所有环境变量:

env

查看单个环境变量:

echo $环境变量名

导进自定义环境变量:(如果不加export,叫做本地变量)

export name=value (可以是数字、字符等)

删除环境变量:

unset XXX

示例:

export mypath=1111#添加

env#全局查找

echo $mypath#单独查找

unset mypath #删除

env#全局查找

常见的环境变量:
HOME:家目录
PWD:当前路径,会动态跟进修改
HISTSIZE:历史命令记录(Linux默认1000条,我的显示是10000条)
SHELL:外壳程序

3、整体理解环境变量,系统,程序

bash进程启动的时候,默认会给子进程形成两张表:
 

argv[]命令行参数表:有用户输入命令行形成
env[]环境变量表:由操作系统的配置文件读取来形成

其中,bash通过某种方式将两张表交给子进程(其实是通过execvpe函数,在进程替换部分有)
所以,本质上,echo $PATH命令的执行
其实就是在env[]环境变量表(二级指针数组)进行遍历查找并打印出来的过程
再继续理解,其实export环境变量,其实就是再env[]环境变量表中添加一个字符串而已

其实,mian函数最多可以有三个参数:

int argc, char* argv[], char* env[]

环境变量具有系统级别的全局属性,因为环境变量本身可以被子进程继承
为什么被子进程继承就有全局属性呢?
因为bash是所有进程的父进程

4、如何获取环境变量(c语言)

(1)getenv() 函数:

函数原型:

char *getenv(const char *name);

功能:根据给定的环境变量名称 name,返回对应的环境变量值(字符串形式)。如果该环境变量不存在,则返回 NULL。
示例用法:(variable意为变量)

#include <stdio.h>
#include <stdlib.h> // for getenv()

int main() {
    char *env_value = getenv("PATH");
    if (env_value != NULL) {
        printf("PATH environment variable: %s\n", env_value);
    } else {
        printf("PATH environment variable not found.\n");
    }
    return 0;
}

(2)使用 extern char **environ

功能:environ 是一个全局变量,它指向当前进程的环境变量数组。可以遍历这个数组来获取所有的环境变量及其值。
示例用法:

#include <stdio.h>
extern char **environ;

int main() {
    char **env = environ;
    while (*env != NULL) {
        printf("%s\n", *env);
        env++;
    }
    return 0;
}

注意:使用 environ 时,需要包含 <stdio.h> 头文件,但不需要额外的 <stdlib.h>。

5、内建命令

Linux内建命令(built-in commands)指的是直接由shell(如bash)内部实现并提供的命令,而不是通过调用外部可执行文件来执行。这些命令被编译进shell的可执行文件中,因此在调用它们时不需要创建新的进程,执行速度相比外部命令更快,并且对shell的控制能力更强。

特点和用法:

  1. 性能优势:由于内建命令不需要调用外部程序,因此执行速度通常比外部命令更快,特别是在频繁调用时能显著减少系统资源的消耗。

  2. 对shell的影响:内建命令可以更深入地影响和操作shell的状态和行为,例如改变shell的环境变量、控制shell的作业和进程、修改shell的行为等。

  3. 通常的内建命令:具体的内建命令会因不同的shell而有所差异

以下是bash shell中常见的内建命令示例:

内建命令功能
cd切换当前工作目录
echo打印文本或变量到标准输出
alias创建命令别名
export设置环境变量
unset删除环境变量或shell变量
exit退出当前shell
jobs显示当前作业(jobs)列表
fg将后台作业切换到前台
bg将作业置于后台运行
source 或 .执行shell脚本并保持在当前shell环境中

 

export、echo等为内建命令
也就是说,这些命令是bash内部的一个函数
执行这些程序时,不需要创建子进程
而是bash直接调用内部的函数

因此,命令分为两种:一个是普通命令,一个是内建命令
80%的命令是普通命令,普通命令需要创建子进程

本地变量(即未用export命令添加的环境变量成为本地变量)只在本bash内部有效,无法被子进程继承下去,需要export导入环境变量,即添加到环境变量表中,此时才能获取


 

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

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

相关文章

uniapp(scroll-view)设置show-scrollbar无效

一、描述 在uniapp中&#xff0c;使用scroll-view内置组件&#xff0c;我这里是把他弄成一个可以滑动的导航&#xff0c;设置show-scrollbar"false"之后&#xff0c;按道理来说应该可以了&#xff0c;这个官方提供的一个属性可以不显示滑动条。但是&#xff0c;发现&…

影响气动小流量调节阀EMC测试价格因素是什么

气动小流量调节阀是一种顶导向单阀座调节阀&#xff0c;具有结构简单、密封性能好、使用可靠等特点。有效而足够的顶部导向系统克服小开度时的震动&#xff0c;有效使用寿命更长。气动小流量调节阀流量系数KV值从1.0到10-5的称为小流量调节阀&#xff0c;当Kv≤210-2时&#xf…

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组⑨ | 11.23 - 11.25

前言 第11章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于10大管理的内容&#xff0c;学习要以教材为准。本章上午题分值预计在15分。 目录 11.23 规划采购管理 11.23.1 主要输入 11.23.2 主要输出 11.23.3 合同类型 11.23.4 合同内容 11.24 规划干…

如何在亚马逊云科技AWS上利用LoRA高效微调AI大模型减少预测偏差

简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 在机器学习和人工智能领域&#xff0c;生成偏差…

Radiant Photo 1.4.1 AI智能完美照片修图插件支持PS ai beta

前言 Radiant Photo 是一款高效的照片编辑与增强应用。这款软件配备了多样化的编辑工具及特效&#xff0c;使得用户能够便捷地改善、修正并提升图片质量&#xff0c;让照片看起来更为出色且引人注目。无论你是日常使用者还是专业的摄影人士&#xff0c;都能够借助这款应用来增…

DBMS 与 RDBMS

DBMS 与 RDBMS 了解数据库什么是数据库管理系统&#xff1f;Types of DBMS 数据库管理系统的类型T数据库管理系统的好处 关系型数据库管理系统的优点 【纪录片】中国数据库前世今生 在数字化潮流席卷全球的今天&#xff0c;数据库作为IT技术领域的“活化石”&#xff0c;已成为…

常见用于联邦学习的数据集【FL】【Datasets】

文章目录 数据集CIFAR-10/CIFAR-100&#xff1a;CIFAR-10CIFAR-100特点以CIFAR-10 为例&#xff1a;示例内容batches.metadata_batch_1 到 data_batch_5test_batch图片转换Python脚本&#xff1a; MNIST&#xff1a;Fashion-MNIST&#xff1a;EMNIST&#xff1a;Googles Federa…

OpenCSG首发中文Chinese Mistral Large 2!

前沿科技速递&#x1f680; &#x1f389; 震撼发布&#xff01;OpenCSG再次微调发布CSG-Wukong-Chinese-Mistral-Large2-123B模型&#xff01; &#x1f50d; 本次工作基于mistral-large-instruct-2407进行微调&#xff0c;采用了尖端的训练技术和优化策略&#xff0c;确保模型…

ZBrush

所有建模软件最开始需要搞清楚的就是基础操作&#xff0c;如旋转视角&#xff0c;放大缩小&#xff0c;移动等&#xff0c;一般可以看上手教程 zbrush中雕刻很重要的概念是笔刷&#xff1a;ZBrush笔刷介绍-CSDN博客 基本操作 编辑模式&#xff1a;T 清除画布&#xff1a;ctr…

Kibana未授权访问漏洞

8.Kibana未授权访问漏洞 Kibana如果允许外网访问且没有做安全登录认证&#xff0c;就会被外部任意访问&#xff0c;查看所有数据&#xff0c;造成数据泄露。在默认配置下&#xff0c;Kibana就可以访问Elasticsearch中的所有数据 步骤一:使用以下Fofa语句搜索Kibana产品并打开…

如何申请https证书

申请HTTPS证书通常遵循以下几个步骤&#xff0c;这些步骤可能会根据不同的证书颁发机构(CA)有所变化&#xff0c;但大体流程相似&#xff1a; 选择证书类型 根据你的需求选择合适的HTTPS证书类型。 常见的类型有&#xff1a; 域名验证型(DV)&#xff1a;验证域名所有权&…

骨传导耳机哪个牌子好?五款业界高性能机型推荐,让你选购不迷茫!

骨传导耳机哪个牌子好&#xff1f;哪款耳机值得入手&#xff1f;作为一名资深的数码设备测评师&#xff0c;我极力推荐大家尝试下骨传导耳机&#xff0c;它无需直接堵塞耳道&#xff0c;既能起到保护听力的作用&#xff0c;又能在使用中保持对外界的环境感知。然而&#xff0c;…

python合并音视频-通过ffmpeg合并音视频

&#x1f308;所属专栏&#xff1a;【python】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的…

龙迅LT8713SX 高性能TYPE-C/DP转三端口DP1.4/HDMI 2.0转换器,带音频

龙迅LT8713SX描述&#xff1a; LT8713SX是一个高性能类型-C/DP1.4到Type-C/DP1.4/HDMI2.0转换器&#xff0c;具有三个可配置的DP1.4/HDMI2.0/DP输出接口和音频输出接口。LT8713SX同时支持显示端口™单流传输&#xff08;SST&#xff09;模式和多流传输&#xff08;MST&#xf…

澳大利亚站 儿童水上玩具认证 AS/NZS ISO 8124.1:2002认证

什么是水上玩具&#xff1f; 此强制性标准适用的水上玩具应具备以下设计&#xff1a; 可承受 14 岁以下儿童的体重 供儿童在浅水中玩耍时使用 是否充气以及是否设计用于佩戴或以其他方式贴在身体上。 水上玩具包括但不限于&#xff1a; 充气新奇形状 适用于浅水的充气玩具…

探索ISO三大体系:企业卓越管理的核心之道

ISO 9001质量管理体系是国际上最广泛应用的质量管理标准&#xff0c;旨在帮助企业建立和实施有效的质量管理体系。通过ISO 9001认证&#xff0c;企业可以确保其产品和服务持续满足客户需求&#xff0c;从而赢得市场竞争的主动权。 实施ISO 9001质量管理体系&#xff0c;企业可以…

书生大模型学习笔记3 - 书生开源大模型链路体系

学习视频链接&#xff1a;书生浦语大模型全链路开源体系_哔哩哔哩_bilibili

算法力扣刷题记录 六十六【39. 组合总和】

前言 回溯章节第四篇。回顾&#xff1a;前三篇——组合问题&#xff1a;同一个集合中取元素&#xff1b;不同集合中取元素。 本文&#xff1a;记录 六十六【39. 组合总和】 一、题目阅读 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出…

生产环境中如何防止rm -ef 删库操作?

有这样一个故事 在一个风和日丽的下雨天,某猿带着还未从睡梦中醒来的脑子,打开了服务器,完成了一套华丽的rm -ef操作. 对于linux 很多人都认为将用root权限将系统“rm -rf /”整个盘的数据将会丢失&#xff0c;首先请不要紧张不要对数据盘执行任何操作。如果命令正在执行请立即…

Python 爬虫项目实战(一):爬取某云热歌榜歌曲

前言 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也称为网页蜘蛛&#xff08;Web Spider&#xff09;或网页机器人&#xff08;Web Bot&#xff09;&#xff0c;是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索引、内容抓…