Linux: 命令行参数和环境变量究竟是什么?

Linux: 命令行参数和环境变量究竟是什么?

  • 一、命令行参数
    • 1.1 main函数参数意义
    • 1.2 命令行参数概念
    • 1.3 命令行参数实例
  • 二、环境变量
    • 2.1 环境变量概念
    • 2.2 环境变量:PATH
      • 2.2.1 如何查看PATH中的内容
      • 2.2.2 如何让自己的可执行文件不带路径运行
    • 2.3 环境变量:PWD
    • 2.3 环境变量: HOME
  • 三、获取环境变量的3种方式
    • 3.1 getenv()函数
    • 3.2 main函数传参
    • 3.3 通过第三方变量environ获取(extern char** environ)
  • 四、环境变量如何获取
    • 4.1 子进程环境变量获取方式
    • 4.2 父进程环境变量获取方式
  • 五、本地变量和环境变量
  • 六、Linux命令分类和环境变量相关的命令

一、命令行参数

 在main函数中,我们可以给main函数传递3个参数(库函数头为main(int argc, char *argv[], char *env[]))(这里我们只用前两个参数)。那究竟如何给main函数传递参数呢?每个参数分别表示什么?

1.1 main函数参数意义

main函数中,argc表示指针数组arvg中有效元素的个数。接下来我们来看一段代码!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

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

【运行现象】:
在这里插入图片描述

1.2 命令行参数概念

 1.1中main()函数在运行时,我们输入的指令会被bash或shell当成一个大的字符串,并以空格的形式分割成若干个小的字符串。而这些小字符串会形成一张指针数组表,bash或shell会指针数组有效个数传给argc参数,指针数组表地址传给argc参数

在这里插入图片描述
 我们在来看看系统指令现象,来对比上述mian函数。

在这里插入图片描述

我们将上述这种lsls -lls -l -a称之为命令行参数。输入的指令会被bash或shell以空格分割成小字符串,并形成一种指针数组表用于存放每一个小的字符串,并将该指针数组的有效个数传递给mian函数的argc参数,而指针数组表的地址传递给argv参数。其中./mybinls这种为可执行程序、其他的为选项。命令行参数可以让同一段代码通过不同的选项来实现不同的功能!!

1.3 命令行参数实例

 下面我们希望一段代码,通过不同的指令来实现简单的计算器。其中格式为可执行程序 功能参数(add、sub、mul、div) 两个参与运算的数据d1 d2
 显然我们需要给mian函数中,有效字符的个数为4,此时我们仅需比较argv[1]传递的字符串是什么即可判断对于的功能选项。下面我们来看看如何实现吧!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
    
int main(int argc, char *argv[])    
{    
    if(argc != 4)//传入数据错误,显示正确使用手册    
    {        
        printf("Use error\nUsage %s op[-add|sub|mul|div] d1 d2\n", argv[0]);    
        return 1;    
    }    
    
    int x = atoi(argv[2]);//将字符窜转整型    
    int y = atoi(argv[3]);    
    if(strcmp(argv[1], "add")==0)    
    {    
        int result = x + y;    
        printf("%d + %d = %d\n", x, y, result);    
    }    
    else if(strcmp(argv[1], "sub")==0)    
    {    
        int result = x - y;    
        printf("%d - %d = %d\n", x, y, result);    
    }    
    else if(strcmp(argv[1], "mul")==0)    
    {    
        int result = x * y;    
        printf("%d * %d = %d\n", x, y, result);                                                                                                          
    
    }    
    else if(strcmp(argv[1], "div")==0)    
    {    
        if(y == 0)//非法数据、除数为0
        {
            printf("%d/%d=error! div zero\n", x, y);
        }
        else 
        {
            int result = x / y;
            printf("%d / %d = %d\n", x, y, result);
        }
    }
    else
    {
        printf("Use error\nUsage %s op[-add|sub|mun|div] d1 d2\n", argv[0]);

    }
    return 0;
}

【测试结果】:

在这里插入图片描述

二、环境变量

 在shell中,对于系统指令(lspwd)的我们直接在命令行输入相关指令便可执行对于的功能;但对于用于自己编写的可执行程序,运行时必须在前加./来指令程序的相对路径。而这种差异就和环境变量有关!!

2.1 环境变量概念

环境变量(environment variables)一般是指在操作系统中,用于指定操作系统运行环境的一些参数。环境变量通常具有特殊用途,并且具有全局特性!!
 比如我们在编写C/C++程序时,我们不知道、也不关心所谓的动/静态库在哪里。但我们每次都能编译成功,形成可执行程序。原因在于有相关的环境变量帮助编译器进行查找!!

下面我们来看看操作系统中,究竟有哪些常见的环境变量!

2.2 环境变量:PATH

PATH是用于指定系统搜索路径的环境变量。

 在命令行参数讲解中,有一个小细节。系统指令可以直接只需在命令行输入相关指令便可执行对于的功能,而我们自己的可执行程序必须在前面加./,否则会报错:command not found。这是为啥呢?
 原因在于运行一个可执行程序前,操作系统需要得到该可执行程序的路径
。这只是为啥我们自己的可执行程序必须加./才能运行。至于系统指令,原因在于环境变量PATH中保存着一系列系统搜索路径。运行系统指令时,操作系统会依次搜索PATH中保存的路径,只要PATH中保存了当前指令的存在路径,程序便可以运行成功!!

2.2.1 如何查看PATH中的内容

 我们可以通过指令echo $PATH来查看PATH中保存的内容。PATH保存的路径会以冒号作为分割符,将路径分隔开!

在这里插入图片描述

2.2.2 如何让自己的可执行文件不带路径运行

$emsp;让自己的可执行程序不带路径运行通常由两种方法:将可执行文件路径添加到PATH环境变量中、将可执行文件拷贝到系统的指定路径下!!

【将可执行文件路径添加到PATH环境变量】:
 我们可以通过指令PATH=&PATH:可执行文件路径将可执行文件路径添加到PATH环境变量!!

在这里插入图片描述

  • 上述行为都是对内存中的数据进行操作。默认更改的环境变量、仅限于本次登录!!

【将可执行文件拷贝到系统的指定路径下】:

在这里插入图片描述
tips:

  • 上述将指定文件拷贝到系统指定路径下的行为也被称为程序安装!!系统运行可执行程序时,默认会在环境变量和系统指令路径下进行查找!

2.3 环境变量:PWD

$emsp;我们在来看看下面这些指令:
在这里插入图片描述
 我们发现pwd指令每次都能成功获取到当前工作坐在路径!这时为何?
原因在于系统中存在一个环境变量PWD,该环境变量用于保存用户的当前工作路径。每次执行pwd执行时,pwd会读取环境变量PWD中的内容,并回显给用户!

2.3 环境变量: HOME

 我们每次在登录shell时,为什么对于root账号,所处工作目录为/root;而对于普通用户,则是/home xxx?
原因在于系统中存在某些环境变量,在我们还未登录时就已经被加载了。这些变量是由操作系统的配置文件或命令行参数指定的。当用于登录shell时,该环境变量会识别出用户的身份,从而初始化环境变量HOME。最后shell直接通过cd $HIME达到上述现象。
shell环境变量加载流程
在这里插入图片描述

三、获取环境变量的3种方式

 在Linux中,我们可以通过env指令来查看当前进程中的所有环境变量。而获取环境变量通常有以下3种方式。

3.1 getenv()函数

 在Linux中,提供一个名为getenv函数(char *getenv(const char *name););该函数可以获取环境变量中的内容。

例如:
【源代码】:

int main(int argc, char *argv[], char *env[])    
{    
    printf("PATH:%s\n", getenv("PATH"));; 
 	  return 0;
}

【运行结果】:
在这里插入图片描述

3.2 main函数传参

 在命令行参数中,我们已经提到过mian函数可以传3个参数,mian函数原型为:main(int argc, char *argv[], char *env[])
程序在启动时,系统可以选择的给进程(main函数)提供两张表:命令行参数表(argc维护)、环境变量表(env维护)。

【源代码】:

#include <stdio.h>

int main(int argc, char *argv[], char* env[])
{
    for(int i = 0; env[i]; i++)
        printf("env[%d]: %s\n", i, env[i]);
    return 0;
}

【运行结果】:
在这里插入图片描述

3.3 通过第三方变量environ获取(extern char** environ)

 在shell中,环境变量会以写时拷贝的方式继承给子进程。换而言之,环境变量具有全局属性,父子进程以写时拷贝的方式看到同一种环境变量表。
 那子进程如何“继承”的环境变量表呢?
libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。

实例:
【源代码】:

#include <stdio.h>

int main()
{
    extern char **environ;
    for(int i = 0; environ[i]; i++)
        printf("environ[%d]: %s\n", i, environ[i]);
    return 0;
}

【运行结果】:
在这里插入图片描述

四、环境变量如何获取

4.1 子进程环境变量获取方式

 命令行启动的进程都是shell或bash的子进程,而子进程的环境变量都是父进程以命令行参数的形式传递给子进程的。

4.2 父进程环境变量获取方式

 在shell中直接修改环境变量PATH虽然可行,但这是直接更改shell进程内部的环境变量信息。在下一次登录时,该修改值会被恢复!!

 这是由于父进程(准确的来说是shell)每次重新登录时,都会形成新的bash解释器,并且bash解释器会自动读取配置文件./.bash_profile(在家目录下)中的信息,为shell进程形成一张环境变量表!!即父进程shell的环境变量信息是以脚本配置文件的形式存在的!!

五、本地变量和环境变量

 在shell中除了系统默认的环境变量,也可以手动添加环境变量!

【例如】:

MYENV=helloLinux

在这里插入图片描述
 当上述添加的环境变量并未添加到环境变量表中,被称为本地变量。使用export指令可以将本地变量导入环境变量表中,变为环境变量!!即export MYENV

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

六、Linux命令分类和环境变量相关的命令

 在Linux中,Linux命令分为常规命令和内建命令。

命令种类用途
常规命令fork让子进程执行的。具体表现在对环境变量PATH清空后,诸如ls、cd、mkdir、touch等指令失效
内建命令shell内部的一个函数,可以直接读取shell内部的本地变量。如export、pwd

环境变量相关的命令

命令种类用途
echo显示某个环境变量值
export设置一个新的环境变量
env显示所有环境变量
unset清除环境变量
set:显示本地变量和环境变量

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动化立体仓库设计步骤:7步

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 这份文件是关于自动化立体仓库设计步骤的详细指南&#xff0c;其核心内容包括以下几个阶…

如何禁用键盘上的特定键或快捷方式?这里有详细步骤

要禁用特定的键盘键或快捷键吗&#xff1f;微软官方应用程序Microsoft PowerToys使这项任务变得非常简单。以下是使用Microsoft PowerToys中的键盘管理器禁用特定键或快捷方式的快速指南。 如果你还没有安装Microsoft PowerToys 如果你的设备上没有安装Microsoft PowerToys&a…

新能源汽车推广 - 世媒讯软文发稿需要注意什么

在环保意识日益增强和政策支持的背景下&#xff0c;新能源汽车市场迎来了前所未有的发展机遇。对于新能源汽车企业而言&#xff0c;如何有效地推广产品成为了关键。而软文发稿作为一种重要的营销手段&#xff0c;能够通过内容的形式潜移默化地影响消费者的认知和决策。那么&…

由于找不到emp.dll无法运行游戏的多个有效解决方法分享

在玩游戏时候是否遇到过找不到emp.dll,无法继续执行代码问题无法打开游戏&#xff1f;那么这个emp.dll是什么呢&#xff1f;为什么会丢失&#xff0c;emp.dll丢失要怎么办&#xff1f;今天就给大家详细介绍一下emp.dll文件与emp.dll丢失的多个解决方法&#xff01; 一、emp.dll…

【AI技术的未来之路】从模型到应用,跨越超级应用陷阱,迈向个性化智能体

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 ​ 目录 引言 一、AI技术应用场景探索&#xff1a; 二、避免超级应用陷阱的策略&#xff1a; 三、个…

PaddleVideo:Squeeze Time算法移植

参考PaddleVideo/docs/zh-CN/contribute/add_new_algorithm.md at develop PaddlePaddle/PaddleVideo GitHubAwesome video understanding toolkits based on PaddlePaddle. It supports video data annotation tools, lightweight RGB and skeleton based action recognitio…

[数仓]七、离线数仓(PrestoKylin即席查询)

第1章 Presto 1.1 Presto简介 1.1.1 Presto概念 1.1.2 Presto架构 1.1.4 Presto、Impala性能比较 Presto、Impala性能比较_presto和impala对比-CSDN博客 测试结论:Impala性能稍领先于Presto,但是Presto在数据源支持上非常丰富,包括Hive、图数据库、传统关系型数据库、Re…

Codeforces Round 956 F. array-value 【01Trie查询异或最小值】

题意 给定一个非负整数数组 a a a 对每个长度至少为 2 2 2 的子数组&#xff0c;定义其权值为&#xff1a;子数组内两两异或值最小值 即 b ⊂ a [ l , r ] , w ( b ) min ⁡ l ≤ i < j ≤ r { a i ⨁ a j } b \subset a[l, r], \quad w(b) \min_{l \leq i < j \le…

谷歌账号被停用怎么办?立刻申诉!申诉流程和经验、中英文申诉信模板

很多鞥有这两年新注册的Google账号或者购买的谷歌账号&#xff0c;在使用时可能都遇到过被停用的情况。极端的还有刚注册号&#xff0c;反手就被谷歌 停用了&#xff0c;或者被连续停用。 今天我们就来聊一聊&#xff0c;谷歌账号为什么会被停用&#xff0c;以及谷歌账号被停用…

走拼箱货必看海运拼箱的实用技巧

在国际海运运输中&#xff0c;海运拼箱适用于货物数量较少或体积不足以填满整个集装箱的情况。 海运拼箱货物通常由物流公司或货代进行组织和管理。多个货主的货物通过合理拼装&#xff0c;使集装箱空间得到充分利用。 那么&#xff0c;在海运拼箱和整柜有哪些不同&#xff0c…

淘宝商品历史价格查询(免费)

当前资料来源于网络&#xff0c;禁止用于商用&#xff0c;仅限于学习。 淘宝联盟里面就可以看到历史价格 并且没有加密 淘宝商品历史价格查询可以通过以下步骤进行&#xff1a; 先下载后&#xff0c;登录app注册账户 打开淘宝网站或淘宝手机App。在搜索框中输入你想要查询的商…

Qt 线程 QThread类详解

Qt 线程中QThread的使用 在进行桌面应用程序开发的时候&#xff0c; 假设应用程序在某些情况下需要处理比较复杂的逻辑&#xff0c; 如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。这种情况下就需要使用多线程&#xff0c;其中一个…

亚马逊云科技EC2简明教程

&#x1f4a1; 完全适用于新手操作的Amazon EC2引导教程 简述 在亚马逊云科技中&#xff0c;存在多种计算服务&#xff0c;在此&#xff0c;我们将会着重讨论Amazon EC2(以下简称EC2)&#xff0c;EC2作为亚马逊云科技的明星产品、核心产品&#xff0c;是大多数开发者和企业用…

基于JAVA+SpringBoot+Vue的自动阅卷分析系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 在当前教育评估体系中…

网络安全高级工具软件100套

1、 Nessus&#xff1a;最好的UNIX漏洞扫描工具 Nessus 是最好的免费网络漏洞扫描器&#xff0c;它可以运行于几乎所有的UNIX平台之上。它不止永久升级&#xff0c;还免费提供多达11000种插件&#xff08;但需要注册并接受EULA-acceptance–终端用户授权协议&#xff09;。 它…

【面试八股总结】面向对象三大特性、虚函数、纯虚函数、虚继承

参考资料&#xff1a;阿秀 一、面向对象三大特性 封装&#xff1a;将数据和代码捆绑在一起&#xff0c;避免外界干扰和不确定性访问 继承&#xff1a;让某种类型对象获得另一个类型对象的属性和方法 多态&#xff1a;同一种事务表现出不同事务的能力&#xff0c;即&#xf…

算法小练之 位运算基础

前言 今天正式走入&#xff0c;位运算这个章节&#xff0c;关于这一部分我会先介绍几个重要的知识点&#xff0c;然后再根据几个力扣上的题来讲解。 了解6种位操作 总所周知&#xff0c;变量在计算机中都是二进制存储的&#xff0c;比如一个变量int a 1&#xff1b; 它的存…

Halcon 模糊圆边的找圆案例

Halcon 模糊圆边的找圆案例 基本思路 1.将图像转成灰度图像 2.再观察要找到的区域的灰度值变化&#xff0c;找到前景与背景的具体数值。 3.根据找到的前景与背景的具体数值&#xff0c;增强图像对比度。&#xff08;使图像变成黑白图片&#xff09; 4.使用灰度直图工具进行阈值…

gRPC 接口测试最佳实践

gRPC 是由谷歌开发的现代开源高性能 RPC 远程过程调用框架&#xff0c;由于采用了HTTP/2 作为底层传输协议&#xff0c;它特别适用于高性能应用场景。gRPC 在视频流传输等大规模数据传输场景以及密集的服务间通讯的微服务架构中表现出色。 数据交换使用轻量级的 Protobuf 序列…

18.按键消抖模块设计(使用状态机,独热码编码)

&#xff08;1&#xff09;设计意义&#xff1a;按键消抖主要针对的时机械弹性开关&#xff0c;当机械触点断开、闭合时&#xff0c;由于机械触点的弹性作用&#xff0c;一个按键开关在闭合时不会马上稳定地接通&#xff0c;在断开时也不会一下子就断开。因而在闭合以及断开的瞬…