【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


总结

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

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

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

相关文章

【UE5.1 角色练习】13-枪械射击——拿出与收起武器

目录 效果 步骤 一、安装射击武器 二、拿武器和收武器 效果 步骤 一、安装射击武器 1. 在虚幻商城中将“FPS Weapon Bundle”添加到工程中&#xff0c;由于我们使用的是5.1版本&#xff0c;我们可以先将该资产放入UE4工程中&#xff0c;然后迁移到5.1版本的工程 2. 打开角…

一.2.(4)放大电路静态工作点的稳定;(未完待续)

1.Rb对Q点及Au的影响 输入特性曲线&#xff1a;Rb减少&#xff0c;IBQ&#xff0c;UBEQ增大 输出特性曲线&#xff1a;ICQ增大&#xff0c;UCEQ减少 AUUO/Ui分子减少&#xff0c;分母增大&#xff0c;但由于分子带负号&#xff0c;所以|Au|减少 2.Rc对Q点及Au的影响 输入特性曲…

css之transform-origin

transform-origin 是 CSS 中的一个属性&#xff0c;它允许你改变一个元素变形的原点。默认情况下&#xff0c;变形的原点位于元素的中心点&#xff0c;即50% 50%&#xff08;或 center center&#xff09;。但是&#xff0c;通过使用 transform-origin 属性&#xff0c;你可以将…

【JavaSE复习】数据结构、集合

JavaSE 复习 1.数据结构1.1 查找1.1.1 基本查找1.1.2 二分查找1.1.3 插值查找1.1.4 斐波那契查找1.1.5 分块查找1.1.6 分块查找的扩展&#xff08;无规律数据&#xff09; 1.2 排序1.2.1 冒泡排序1.2.2 选择排序1.2.3 插入排序1.2.4 快速排序 2. 集合2.1 基础集合2.1.1 集合和数…

React中的useCallback

引言 在React应用开发中&#xff0c;优化组件性能是一个持续的过程。useCallback是一个React Hook&#xff0c;它用于记忆化回调函数&#xff0c;确保这些函数在组件的整个生命周期内保持一致&#xff0c;从而避免不必要的渲染和性能问题。 问题背景 在React中&#xff0c;如…

【玩转python】入门篇day09-python数据类型转换

在Python中&#xff0c;数据类型转换是一项非常常见的操作&#xff0c;它允许我们将一种类型的数据转换为另一种类型。这种转换在处理来自不同源的数据时尤其有用&#xff0c;例如用户输入、文件读取或网络数据等。下面&#xff0c;我将通过代码示例来展示如何将其他数据类型转…

android 在清单文件中配置receiver,系统是何时会注册此广播接收者的?

在 Android 中&#xff0c;通过清单文件&#xff08;AndroidManifest.xml&#xff09;配置的广播接收器&#xff08;BroadcastReceiver&#xff09;&#xff0c;系统会在特定的时机自动注册这些广播接收器。以下是详细的说明&#xff1a; 静态注册的广播接收器 静态注册的广播…

爱了!8款超好用的PC端办公软件!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 你电脑中用的最久的软件是哪些&#xff1f;以下是否有你曾经使用过的软件呢&#xff1f;工欲善其事&#xff0c;必先利其器&#xff0c;今天继续…

无人机便携式侦测干扰设备(定全向)技术详解

无人机便携式侦测干扰设备&#xff08;定全向&#xff09;是一种专门针对无人机进行侦测和干扰的设备。它具备定向和全向两种工作模式&#xff0c;能够覆盖较宽的频率范围&#xff0c;有效侦测并干扰无人机与遥控器之间的通信信号&#xff0c;从而达到控制或驱离无人机的目的。…

验证回文串-string题目

用双指针&#xff0c;left right从两头往中间对比&#xff0c;不是字母的都略过&#xff0c;比的时候化成小写字母 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool isPalindrome(string s) {if(s.size() < 1)return true;int left …

Java SE入门及基础(61) 死锁 死锁发生条件

目录 死锁 1. 死锁的概念 2. 死锁发生条件 互斥条件 不可剥夺条件 请求与保持条件 循环等待 3. 案例分析 示例 分析 死锁 1. 死锁的概念 Deadlock describes a situation where two or more threads are blocked forever, waiting for each other 死锁描述了一种情…

帧布局的概念与属性

帧布局&#xff08;FrameLayout&#xff09;顾名思义就是将控件一层一层叠在一起&#xff0c;像视频的帧一样&#xff0c;一层叠一层&#xff0c;如图所示&#xff0c;帧布局中BUTTON叠在ImageView之上。帧布局常见的属性见表1。帧布局中的控件可以使用android:layout_gravity&…

论文复现-基于决策树算法构建银行贷款审批预测模型(金融风控场景)

作者Toby&#xff0c;来源公众号&#xff1a;Python风控模型&#xff0c;基于决策树算法构建银行贷款审批预测模型 目录 1.金融风控论文复现 2.项目背景介绍 3.决策树介绍 4.数据集介绍 5.合规风险提醒 6.技术工具 7.实验过程 7.1导入数据 7.2数据预处理 7.3数据可…

Spring Boot中的数据迁移策略

Spring Boot中的数据迁移策略 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、引言 在软件开发的过程中&#xff0c;经常会遇到需要修改数据库结构、迁移…

SpringBoot3+Vue3开发园区管理系统

介绍 在当今快速发展的城市化进程中&#xff0c;高效、智能的园区管理成为了提升居民生活品质、优化企业运营环境的关键。为此&#xff0c;我们精心打造了全方位、一体化的园区综合管理系统&#xff0c;该系统深度融合了园区管理、楼栋管理、楼层管理、房间管理以及车位管理等…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【明文导入密钥(ArkTS)】

明文导入密钥(ArkTS) 分别以导入AES256与RSA2048密钥为例&#xff0c;具体的场景介绍及支持的算法规格 开发步骤 指定密钥别名keyAlias。 密钥别名的最大长度为64字节。 封装密钥属性集和密钥材料。 密钥属性集同样与密钥生成中指定的密钥属性一致&#xff0c;须包含[HuksKe…

比较链表和数组在数据结构中的优缺点和适用场景。

在数据结构中&#xff0c;链表&#xff08;Linked List&#xff09;和数组&#xff08;Array&#xff09;是两种基础且广泛使用的数据结构&#xff0c;它们各有其独特的优缺点&#xff0c;适用于不同的场景。下面从技术难点、面试官关注点、回答吸引力及代码举例四个方面详细阐…

昇思MindSpore学习总结十——ResNet50迁移学习

1、迁移学习 &#xff08;抄自CS231n Convolutional Neural Networks for Visual Recognition&#xff09; 在实践中&#xff0c;很少有人从头开始训练整个卷积网络&#xff08;使用随机初始化&#xff09;&#xff0c;因为拥有足够大小的数据集相对罕见。相反&#xff0c;通常…

Apache Seata透过源码解决SeataAT模式整合Mybatis-Plus失去MP特性的问题

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata透过源码解决SeataAT模式整合Mybatis-Plus失去MP特性的问题 透过源码解决SeataAT…

【机器学习】机器学习与时间序列分析的融合应用与性能优化新探索

文章目录 引言第一章&#xff1a;机器学习在时间序列分析中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 数据增强 1.2 模型选择1.2.1 自回归模型1.2.2 移动平均模型1.2.3 长短期记忆网络1.2.4 卷积神经网络 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 A…