【Linux课程学习】:命令行参数,环境变量

举报
我们的五年 发表于 2024/12/06 16:15:19 2024/12/06
【摘要】 1.变量定义在for循环中,在c99和c++中才支持:gcc $^ -o $@  -std=c992.命令行也是一个进程,它的父进程都是shell。3.对于父子进程,对于父进程只读的数据,不会修改的数据,不会拷贝一份,但是子进程可以看到。4.编译器,加载器,操作系统表示互相割裂的,彼此有联系。5.env和argv都是以NULL结尾,env没有个数,可以通过这样的方法进行打印env。6.ech...

1.变量定义在for循环中,在c99和c++中才支持:

gcc $^ -o $@  -std=c99

2.命令行也是一个进程,它的父进程都是shell。

3.对于父子进程,对于父进程只读的数据,不会修改的数据,不会拷贝一份,但是子进程可以看到。

4.编译器,加载器,操作系统表示互相割裂的,彼此有联系。

5.env和argv都是以NULL结尾,env没有个数,可以通过这样的方法进行打印env。

6.echo进行打印时,如果不加$表示的是字符串,加$才表示变量。

7.PATH=……:这样进行修改环境变量PATH是覆盖式的修改。

8.我们进行的环境变量的修改,只是改了内存级的环境变量,进程中的环境变量。当我们退出以后,环境变量重新被加载,这样就没有了我们之前修改的环境变量。环境变量在系统的配置文件中。文件时磁盘级存储的。

9.打开shell---》启动一个进程---》读取系统和用户的环境变量》在内存中就会保存这些环境变量

10.source 文件:让配置文件生效。

命令行参数:
int main(int argc,char* argv[ ])

argc表示参数的个数,crgv[]表示参数清单,是一个一个的字符串。

根据下面的测试结果,我们知道argv是我们在命令行输入的命令,所以argv[1]是./code ,后面的根据输入的命令而定。

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



用命令行参数实现不同功能的程序:
有了命令参数,让一个程序可以实现不同的功能。

比如:命令中的选项的实现。

#include <stdio.h>    
#include <string.h>    
    
int main(int argc,char* argv[])    
{    
    if(argc<2)    
    {    
        printf("未传参数,opt1,opt2,opt3\n");    
    }    
    else if(argc>2)    
    {    
        printf("参数过多,pt1,opt2,opt3\n");    
    }    
    else if(strcmp(argv[1],"opt1")==0)    
    {    
        printf("l love xy!\n");    
    }    
    else if(strcmp(argv[1],"opt2")==0)    
    {    
    
        printf("l love xy!,Future home will have bathtubs!\n");    
    }    
    else if(strcmp(argv[1],"opt3")==0)    
    {    
        printf("l love you,Future home will have bathtubs!l promise!\n");                                                                                                                                          
    }    
    
    else    
    {    
        printf("参数错误\n");    
    }    
    return 0;    
}    

main函数的参数是谁传递的?
1.首先被shell(命令行解释器)拿到。然后shell根据空格,就形成了一张表(argv),也就可以知道元素个数(argc)。这张表中每一个都指向一个字符串,最后以NULL结尾。


2.命令执行的时候,给进程传递,命令行参数。此时就形成了全局的argc和argv[ ],命令行参数是不会发生变化的,这样子进程不用拷贝一份,argc和argv[ ]不会进行修改,只需要只读就行。但是子进程也可以看到。

mian函数被其他的函数调用:
根据参数的不同,就调不同的mian函数。


环境变量:
mian函数中的env:环境变量。

mian中的argv和env都是一张表结构。

查看env,因为argv和env都是以NULL结尾的,所以我们可以以env[i]进行判断真假进行打印所以的env。

for(int i=0;env[i];i++)
{
    printf("env[%d]:%s\n",i,env[i]);
}  
查看环境变量:
1.环境变量是指操作系统中用来指定操作系统运行环境的一些参数。

2.启动的任何一个进程,都会传递这些参数。所以我们才能写一个程序,通过env打印环境变量。

3..环境变量一般用于特殊用途,一般具有全局属性。

4.比如我们从来不知道我们要链接的动态库在哪里,还是可以链接成功。这是环境变量帮助编译器进行查找。

环境的变量的基本格式:key=value,全局变量。

全部都是什么=什么

HISTSIZE:表示命令保存条数。

PATH:告诉shell,应该去哪个路进行查找指令。

PWD:当前用户所在目录。


为什么指令可以不带路径就能运行?
PATH环境变量告诉了shell,应该要去哪个路径下查找。

echo $PATH:打印PATH环境变量。

有很多的路径,以:作为分隔符。


我们自己的程序要带./才能找到我们要执行的程序。

而系统就能知道指令在/user/bin路劲下。

PATH环境变量:系统可执行文件的搜索路径集合。

我们进行的环境变量的修改,只是改了内存级的环境变量,进程中的环境变量。当我们退出以后,环境变量重新被加载,这样就没有了我们之前修改的环境变量。

让我们自己的程序也可以不带路径运行:
PATH=……:PATH覆盖式的修改环境变量PATH。

方法一:

可以把我们的程序拷贝到PATH中的任何一个目录下。

方法二:

在PATH中加入我们的可执行程序的目录。可以先pwd查看,然后echo $PATH查看PATH,最后把两个进行拼接,就可以了。

也可以直接$PATH,加上分隔符:,最后加上我们的路径。

如果我们在配置文件中修改PATH,那么每次启动shell的时候,我们新增的PATH被加载。

环境变量的配置文件:


此时在用户下的两个环境变量:都是隐藏文件,以.开头

.bashrc

.bash_profile

用户的配置文件
用户的配置文件,在启动shell的时候,也是要被加载的。

它也是以$PATH的方式进行增加新的PATH环境变量。


让配置文件生效:
source 文件
————————————————


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。