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

news2025/1/10 2:59:13

目录

前言

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


总结

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

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

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

相关文章

数学系C++ 排序算法简述(八)

目录 排序 选择排序 O(n2) 不稳定&#xff1a;48429 归并排序 O(n log n) 稳定 插入排序 O(n2) 堆排序 O(n log n) 希尔排序 O(n log2 n) 图书馆排序 O(n log n) 冒泡排序 O(n2) 优化&#xff1a; 基数排序 O(n k) 快速排序 O(n log n)【分治】 不稳定 桶排序 O(n…

Kaggle网站免费算力使用,深度学习模型训练

声明&#xff1a; 本文主要内容为&#xff1a;kaggle网站数据集上传&#xff0c;训练模型下载、模型部署、提交后台运行等教程。 1、账号注册 此步骤本文略过&#xff0c;如有需要可以参考其他文章。 2、上传资源 不论是上传训练好的模型进行预测&#xff0c;还是训练用的…

2024组装一台能跑AI大模型的电脑

title: 2024组装一台能跑AI大模型的电脑 tags: [组装电脑, AI大模型] categories: [其他, 电脑, windows] 这里不写组装步骤&#xff0c;哪里接线&#xff0c;购买什么品牌网上一大堆。 这里只写如何根据你自己的需求&#xff0c;选择合适的、兼容的配件。 概述 需求&#xff…

区间最值问题-RQM(ST表,线段树)

1.ST表求解 ST表的实质其实是动态规划&#xff0c;下面是区间最小的递归公式&#xff0c;最大只需将min改成max即可 f[i][j] min(f[i][j - 1], f[i (1 << j - 1)][j - 1]); 二维数组的f[i][j]表示从i开始连续2*j个数的最小/大值。 例如&#xff1a;我们给出一个数组…

iOS中多个tableView 嵌套滚动特性探索

嵌套滚动的机制 目前的结构是这样的&#xff0c;整个页面是一个大的tableView, Cell 是整个页面的大小&#xff0c;cell 中嵌套了一个tableView 通过测试我们发现滚动的时候&#xff0c;系统的机制是这样的&#xff0c; 我们滑动内部小的tableView, 开始滑动的时候&#xff0c…

【驱动篇】龙芯LS2K0300之ADC驱动

实验目的 由于LS2K0300久久派开发板4.19内核还没有现成可用的ADC驱动&#xff0c;但是龙芯官方的5.10内核已经提供了ADC驱动&#xff0c;想要在4.19内核使用ADC就要参考5.10内核移植驱动&#xff0c;本次实验主要是关于ADC驱动的移植和使用 驱动移植 主要的驱动代码主要有3个…

ASRock Creator系列GPU:为AI推理及多GPU系统打造,采用16针电源接口的Radeon RX 7900系列显卡

ASRock 正在筹备推出专为人工智能推理和多GPU系统设计的AMD GPU——Creator系列显卡。这一系列显卡采用双槽位、吹风式设计&#xff0c;并配备16针电源连接器&#xff0c;首发产品包括基于Navi 31架构的AMD Radeon RX 7900XTX和RX 7900 XT型号。这些原属于WS系列的显卡最初在20…

网络安全设备——防火墙

网络安全设备防火墙是一种用来加强网络之间访问控制的特殊网络互联设备。以下是对防火墙的详细解释&#xff1a; 一、定义与基本概念 定义&#xff1a;防火墙是指设置在不同网络&#xff08;如可信任的企业内部网和不可信的公共网&#xff09;或网络安全域之间的一系列部件的…

力扣双指针算法题目:快乐数

目录 1.题目 2.思路解析 3.代码展示 1.题目 . - 力扣&#xff08;LeetCode&#xff09; 2.思路解析 题目意思是将一个正整数上面的每一位拿出来&#xff0c;然后分别求平方&#xff0c;最后将这些数字的平方求和得到一个数字&#xff0c;如此循环&#xff0c;如果在此循环中…

【Linux】在线求助命令--help,man page , info page

我们知道Linux有很多的命令&#xff0c;那LInux要不要背命令&#xff1f; 答案是背最常用的那些就行了 那有的时候我们想查询一些命令的详细用法该怎么办呢&#xff1f; 这里我给出3种方法 1.--help --help的使用方法很简单啊 要查询的命令 --help 我们看个例子 这里我只…

DoIP-1 简介

1. 概述 DoIP-Diagnostic Over Internet Protocol &#xff0c;基于TCPIP协议族的诊断传输协议 DoIP国际标准定义为ISO 13400&#xff0c;总共由五部分组成&#xff1a;  ISO13400-1DoIP的综述  ISO13400-2DoIP的传输层和网络层服务&#xff08;主体部分&#xff09;  I…

vue-element-admin集成方案如何运行以及代码解读

文章目录 1.vue-admin-admin介绍2.运行方法3.代码解读3.1基础外层文件解读&#xff0c;以及eslint关闭&#xff08;如下图&#xff09;3.2内层src文件分析3.2.1 login流程解析 1.vue-admin-admin介绍 1.1 是一个后台前端解决方案(vueelementui)&#xff0c;内置i18国际化解决方…

Javascript常见数据结构和设计模式

在JavaScript中&#xff0c;常见的数据结构包括两大类&#xff1a;原始数据类型&#xff08;Primitive Types&#xff09;和对象类型&#xff08;Object Types&#xff09;。对象类型又可以进一步细分为多种内置对象、数组、函数等。下面是一些JavaScript中常见的数据结构&…

【PWN · ret2syscall | GoPwn】[2024CISCN · 华中赛区]go_note

一道GoPwn&#xff0c;此外便是ret2syscall的利用。然而过程有不小的曲折&#xff0c;参考 返璞归真 师傅的wp&#xff0c;堪堪完成了复现。复现过程中&#xff0c;师傅也灰常热情回答我菜菜的疑问&#xff0c;感谢&#xff01;2024全国大学生信息安全竞赛&#xff08;ciscn&am…

落日余晖映晚霞

落日余晖映晚霞&#xff0c;立于海滨&#xff0c;望夕阳余晖洒于波光粼粼之上&#xff0c;金光跳跃&#xff0c;若繁星闪烁&#xff0c;耀人心目。 海风轻拂&#xff0c;心境宁静&#xff0c;凡尘俗务皆于此刹那消散&#xff0c;思绪万干&#xff0c;或忆往昔点滴&#xff0c;或…

7.7 洛谷

约瑟夫环 P1145 约瑟夫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) index(indexm-1)%num;if(index>k && index<2*k){a[index]0;num--;}ac代码 #include<bits/stdc.h> using namespace std; typedef long long ll;#define IOS ios::sync_with_stdio(0…

【MySQL】Mysql数据库导入导出sql文件、备份数据库、迁移数据库

本文摘要&#xff1a;本文提出了xxx的实用开发小技巧。 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&…

UE C++ 多镜头设置缩放 平移

一.整体思路 首先需要在 想要控制的躯体Pawn上&#xff0c;生成不同相机对应的SpringArm组件。其次是在Controller上&#xff0c;拿到这个Pawn&#xff0c;并在其中设置输入响应&#xff0c;并定义响应事件。响应事件里有指向Pawn的指针&#xff0c;并把Pawn的缩放平移功能进行…

秋招突击——7/4——复习{}——新作{最长公共子序列、编辑距离、买股票最佳时机、跳跃游戏}

文章目录 引言复习新作1143-最长公共子序列个人实现 参考实现编辑距离个人实现参考实现 贪心——买股票的最佳时机个人实现参考实现 贪心——55-跳跃游戏个人实现参考做法 总结 引言 昨天主要是面试&#xff0c;然后剩下的时间都是用来对面试中不会的东西进行查漏补缺&#xff…

通过大众点评进行连锁店铺跟踪(均价、门店数等)、关键词店铺挖掘的思路方法

在做一些城市分析、学术研究分析、商业选址、商业布局分析等数据分析挖掘时&#xff0c;大众点评的数据参考价值非常大&#xff0c;这里提供一种通过大众点评进行连锁店铺跟踪&#xff08;均价、门店数等&#xff09;、关键词店铺挖掘的思路方法。 通过大众点评提供搜索页面&a…