【Linux进程】命令行参数 环境变量(详解)

目录

前言

1. 命令行参数

  什么是命令行参数?

2. 环境变量 

 常见的环境变量

如何修改环境变量?

 获取环境变量

 环境变量的组织方式

 拓展问题

 导入环境变量

3. 本地变量*

总结


前言

        在使用Linux指令的时候,  都是指令后边根命令行参数,  每个指令本质都是一个一个的可执行程序, 我们自己编译形成的可执行程序在运行时需要指定路径, 为什么Linux指令不需要, 并且指令的命令行参数又是如何读取的, 我们自己的可执行程序能读取命令行参数吗?  本文将会通过命令行参数与环境变量来解答这些问题;

在这里插入图片描述

1. 命令行参数

  什么是命令行参数?

     命令行参数是用户在命令行界面中输入的附加信息,用于向可执行程序传递参数或选项。

 举个例子 :

        我们常使用的 ls 指令, 就是一个可执行程序, 而后边跟的参数 "-a"  "-l" 这些都属于是命令行参数;

 我们如何获取命令行中的参数?

          在C/C++中, 可以通过main函数的两个参数 (argc和argv) 获取;

 编写一个简单的小程序来获取并打印命令行参数:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.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;
}

 argc表示参数的数量,argv是一个字符串数组,包含了每个参数的具体数值

         通过这个原理,我们可以根据传进来的参数做出判断,来进行相对应的操作,进而达到指令的效果这里我们也可以明白: Linux中的指令可以支持各种的命令行选项,到底是什么原理

2. 环境变量 

        Linux中的指令其实也就是一个个的可执行程序, 那么问题来了,为什么我们执行我们自己的可执行程序时需要带 /而操作系统中的指令却不需要? 这里就需要引入一个新的概念: 环境变量

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

         ./其实是告诉操作系统可执行文件在当前路径,帮助操作系统找到可执行程序,系统的指令也可以指定路径执行,那么为什么系统指令不需要指定文件路径?只有一种解释,这些可执行程序一定存在着默认的搜索路径,在Linux环境变量中有着PATH这个变量,它存放的就是可执行程序的默认搜索路径;

 常见的环境变量
  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • SHELL : 当前Shell,它的值通常是/bin/bash

 使用指令查看环境变量:

  •  查看指定环境变量
echo $NAME //NAME:你的环境变量名称
// 比如我要查看PATH这个环境变量
echo $PATH
  • 查看当前系统中的环境变量
env

         要想我们自己的可执行程序也可以不指定路径直接运行, 只需要把我们的可执行程序移到环境变量指定的路径 或者 把可执行程序的路径添加到环境变量中;

如何修改环境变量?
  •  添加路径:
PATH=$PATH : 可执行程序路径 
//$PATH表示原有内容,:表示追加

 注意:PATH=可执行文件路径会覆盖原有的内容

 添加可执行程序的路径后,再执行可执行文件就不需要指定路径了;

  • 去除添加的路径:

去除路径:可以使用覆盖的方法进行去除,PATH=修改后的PATH进行覆盖

         如果不小心把环境变量清空也不要担心,默认更改环境变量只限于本次登录,只需要重新登录即可恢复

  •  取消环境变量(或本地变量)
unset 环境变量名
 获取环境变量

 前边以经提到了一种获取环境变量的方式(指令), 还有另外三种获取环境变量的方法:

  • 系统调用 (getenv) 
char *who = getenv("USER");
if(strcmp(who, "root") != 0)
{
    printf("%s,是一个非法用户\n",who);
    return 1;
}
  • main函数的第三个参数
#include <stdio.h>

int main(int argc, char *argv[], char *env[])
{
    int i = 0;
    for(; env[i]; i++)
    {
        printf("%s\n", env[i]);
    }
    return 0;
}
  •  通过第三方变量environ获取
#include <stdio.h>
int main(int argc, char *argv[])
{
    extern char **environ;
    int i = 0;
    for(; environ[i]; i++)
    {
        printf("%s\n", environ[i]);
    }
    return 0;
}

         libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明

 环境变量的组织方式

         每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串, 最后以NULL结尾;

 拓展问题
  • 每次普通用户的默认路径都是/home/XXX,root用户就是root/为什么?

 这与环境变量的初始化有关;

 登录的时候:

  1. 输入用户名和密码
  2. 认证
  3. 形成环境变量(不止一个)根据用户初始化HOME=/root,HOME=/home/XXX
  4. cd $HOME
  •  为什么修改的环境变量每次重新登录都会恢复?

         命令行启动的进程都是shell或bash的子进程,命令行参数和环境变量,都是父进程bash传递的;

 bash的环境变量信息可以由命令行参数的形式,直接传递给直系的子进程(被子进程继承下去)

 

        我们直接更改的是bash进程内部的环境变量信息,然而每次登录时都是新的bash进程,每次启动时bash就会从某个地方读取形成自己的环境变量信息;

  •  bash的环境变量信息从哪里来?

         bash的环境变量信息全部都来自系统中的一个配置文件: .bash_profile(脚本配置文件)在每个用户的家目录中,会有一个隐藏文件,.bash profile每次登陆时bash进程都会读取.bash_profile配置文件中的内容,,为bash形成一张环境变量表信息;

 导入环境变量

方法一:

  • MYENV=变量数据 (本地变量)
  • export MYENV

方法二:

  • export MYENV= 变量数据

         我们每次所修改的环境变量(包含自己导入的), 每次登录都会失效, 那有什么办法让它长期(永久)有效?

 打开bash环境变量的配置文件.bash profile:

         在内部像export PATH一样,使用export导入我们自己的环境变量,这样每次重启连接时,bash就会读取加入的环境变量

补充:

         单一的靠.bash profile中的导入其实并不足以获取全部的环境变量, shel脚本中就可以看出,它还依靠着.bashrc这个文件,打开这个文件,发现它还依靠着:/etc/bashrc,从这几个文件中读取完,才可以形成完整的环境变量信息;

3. 本地变量*

         如果只使用MYENV=1000000,不使用export;这时定义的变量就是本地变量;

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

想要让本地变量被子进程获取到只能转为环境变量:export MYENV

为什么说这个?

其实就是想要告诉大家一个 "奇怪" 的现象:

我把PATH清空, 然后我使用 ls 这些命令都失效了, 但是我使用echo却还可以继续使用这是为什么?

在Linux中存在着两种命令:

  • 常规命令:  shell fork(创建子进程)让子进程执行的 (如:Is、mkdir、touch等);
  • 内建命令:  shell内部建立的命令, shell内部的函数(不创建子进程, 由bash自己执行);

 shell内部的函数, 当然可以读取shell内部定义的变量啦!

输出环境变量和本地变量:set


总结

        系统中会存在大量的环境变量,每个变量都有自己的特殊用途,用来完成特定的系统功能; 理解环境变量可以让我们直观的了解系统的配置和运行环境,进一步理解系统的工作原理和功能。这有助于我们更好地与操作系统交互, 让操作系统不再陌生神秘; 好了以上便是本文的全部内容, 希望对你有所帮助, 感谢阅读!

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

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

相关文章

JAVA集合框架、CAS、AQS

目录 一、java 的集合框架有哪些? 二、说-下 ArrayList 和 LinkedList? 三、HashSet和TreeSet的区别? 四、HashMap 的数据结构是什么? 五、CAS机制 六、AQS理解 一、java 的集合框架有哪些? Collection 是 Java 集合框架中的一个根接口&#xff0c;位于 java.util 包中。它…

亲密数对C++函数

自定义函数 #include<bits/stdc.h> using namespace std; //求n的因子和自定义函数 int yinzihe(int n){//使用2~sqrt(n)成对求解因子和int r0,i;//变量 r 初始值为0&#xff0c;因为要存放因子和for(i2;i<sqrt(n);i) {//回顾sqrt()课程//如果 i 是 n 的因子&#xf…

微笑背后的秘密:理解自闭症儿童的面部表情控制

在星贝育园自闭症儿童康复学校&#xff0c;我们常常遇到家长们提出的一个有趣而引人深思的问题&#xff1a;“为什么我的孩子似乎控制不住面部表情&#xff0c;尤其是频繁地笑&#xff1f;”这个问题背后&#xff0c;隐藏着自闭症谱系障碍&#xff08;ASD&#xff09;儿童独特的…

Caffeinated for Mac v2.0.6 Mac防休眠应用 兼容 M1/M2/M3

Caffeinated 可以防止您的 Mac 进入休眠状态、屏幕变暗或者启动屏幕保护。 应用介绍 您的屏幕是否总是在您不希望的时候变暗&#xff1f;那么Caffeinated就是您解决这个大麻烦的最好工具啦。Caffeinated是在Caffeine这个非常便捷、有用的工具的基础上开发而来的。Caffeinated…

20240707 每日AI必读资讯

&#x1f9e0;中国生成式AI专利数量超过美国 6 倍 - 中国在2014年至2023年期间申请的生成式AI专利数量达到38210个&#xff0c;超过了美国的6倍。 - 腾讯、平安保险集团和百度是GenAI专利数量最多的中国公司。 - 中国的顶级学术机构和技术生态为生成式AI的发展提供了强大支持…

算法简介:什么是算法?——定义、历史与应用详解

引言 在现代计算机科学中&#xff0c;算法是一个核心概念。无论是编程还是数据分析&#xff0c;算法都扮演着至关重要的角色。在这篇博客中&#xff0c;我们将深入探讨算法的定义、历史背景以及它在计算机科学中的地位和实际应用。 什么是算法&#xff1f; 算法是解决特定问题…

DHCP的原理及配置

目录 一、了解DHCP服务 1.什么是DHCP 1.1DHCP广播 2.使用DHCP的好处 2.1为什么使用DHCP 3.DHCP的模式与分配方式 3.1分配方式 3.2模式 二、DHCP工作原理 1.四次回话 2.重新登录 3.更新租约 4.扩展 三、安装DHCP服务 四、DHCP局部配置并且测试 五、使用…

简介空间复杂度

我们承接上一篇博客。我们写了时间复杂度之后&#xff0c;我们就要来介绍一下另一个相关复杂度了。空间复杂度。我觉得大家应该对空间复杂度认识可能比较少一些。我就是这样&#xff0c;我很少看见题目中有明确要求过空间复杂度的。但确实有这个是我们不可忽视的&#xff0c;所…

在门店里造绿色氧吧!康养行业也这么卷了?

拼啥不如拼健康&#xff0c;现在的人算是活明白了&#xff0c;不但中老年人这样想&#xff0c;年轻人也这样干。你可能不知道&#xff0c;现在众多健康养生门店&#xff0c;逐渐成了年轻人“组团养生”的好去处&#xff0c;也是他们吃喝玩乐之外的新兴消费趋势。 而在看得见的…

无需服务器,浏览器跑700+AI模型?!【送源码】

Transformers.js 是一个创新的网络机器学习库&#xff0c;它将先进的 Transformer 模型直接带入浏览器&#xff0c;无需服务器端支持。这个库与 Hugging Face 的 Python transformers 库功能对等&#xff0c;提供相似的 API 接口来运行预训练模型&#xff0c;涵盖了自然语言处理…

Java引用的4种类型:强、软、弱、虚

在Java中&#xff0c;引用的概念不仅限于强引用&#xff0c;还包括软引用、弱引用和虚引用&#xff08;也称为幻影引用&#xff09;。这些引用类型主要用于不同的内存管理策略&#xff0c;尤其是在垃圾收集过程中。以下是对这四种引用类型的详细解释&#xff1a; 1. 强引用&am…

【实践分享】深度学习远程连接GPU

目录 前言 一、创建实例 二、上传文件 三、服务器上传 四、运行代码文件 前言 1、使用平台&#xff1a;恒源云 2、教程总结自B站大佬Larry同学发布的教程视频 一、创建实例 通俗&#xff1a;租用一台临时的电脑&#xff0c;电脑可自选GPU型号等&#xff0c;按照项目需…

品质至上!中国星坤连接器的发展之道!

在电子连接技术领域&#xff0c;中国星坤以其卓越的创新能力和对品质的不懈追求&#xff0c;赢得了业界的广泛认可。凭借在高精度连接器设计和制造上的领先地位&#xff0c;星坤不仅获得了多项实用新型专利&#xff0c;更通过一系列国际质量管理体系认证&#xff0c;彰显了其产…

【原理+使用】DeepCache: Accelerating Diffusion Models for Free

论文&#xff1a;arxiv.org/pdf/2312.00858 代码&#xff1a;horseee/DeepCache: [CVPR 2024] DeepCache: Accelerating Diffusion Models for Free (github.com) 介绍 DeepCache是一种新颖的无训练且几乎无损的范式&#xff0c;从模型架构的角度加速了扩散模型。DeepCache利…

树(相关知识点)

目录 结点的度&#xff1a;某一个结点所含有字数的个数 叶节点&#xff1a;最后一个结点 非终端节点:不是叶结点 兄弟结点&#xff1a;亲兄弟结点 树的度&#xff1a;最大节点的度 层次&#xff1a;根为第一层&#xff0c;根的子结点为第二层&#xff0c;以此类推 森林&am…

[附源码]基于Flask的演唱会购票系统

摘要 随着互联网技术的普及和发展&#xff0c;传统购票方式因其效率低下、流程繁琐等问题已难以满足现代社会的需求。本文设计并实现了一个基于Flask框架的演唱会购票系统&#xff0c;该系统集成了用户管理、演唱会信息管理、票务管理以及数据统计与分析等功能模块&#xff0c…

linux centos7.9 安装mysql5.7;root设置客户端登录、配置并发、表名大小写敏感等

查看centos版本 cat /etc/centos-releasecentos版本为7.9 查看是否已安装mariadb,安装了需要先删除 1.查看是否安装了mariadb和mysql&#xff0c;安装了需要先删除 mariadb是mysql的一个分支&#xff0c;但要安装mysql需要删除它 执行rpm -qa|grep mariadb,查看mariadb情况…

Hi6602 恒压恒流SSR电源方案

Hi6602是一款针对离线式反激电源设计的高性能PWM控制器。Hi6602内集成有通用的原边恒流控制技术&#xff0c;可支持断续模式和连续模式工作&#xff0c;适用于恒流输出的隔离型电源应用中。Hi6602内部具有高精度65kHz开关频率振荡器&#xff0c;且带有抖频功能可优化EMI性能。H…

AI大模型技术分析

一文读懂&#xff1a;AI大模型&#xff01; 引言 近年来&#xff0c;随着深度学习技术的迅猛发展&#xff0c;AI大模型已经成为人工智能领域的重要研究方向和热点话题。AI大模型&#xff0c;指的是拥有巨大参数规模和强大学习能力的神经网络模型&#xff0c;如BERT、GPT等&…

java IO流(1)

一. 文件类 java中提供了一个File类来表示一个文件或目录(文件夹),并提供了一些方法可以操作该文件 1. 文件类的常用方法 File(String pathname)构造方法,里面传一个路径名,用来表示一个文件boolean canRead()判断文件是否是可读文件boolean canWrite()判断文件是否是可写文…