Linux---命令行参数+环境变量

一、命令行参数

int main(int argc,char*argv[])
{//...return 0;
}

不知道有没有人见过这样的主函数,它带了两个参数,argv接收的参数就叫做命令行参数,因为它的参数是从命令行来的,给大家演示一下,大家就懂了

命令行中的命令会被按照空格分割成一个个字符串交给argv数组,args中存放数组的元素个数

那么我们就会发现,我们之前用的各种命令+选项,其实就是靠命令行参数实现的,我们可以根据不同的参数,实现不同的功能,下面写一个简易的命令行计算器程序

命令行参数可以支持各种指令级别的命令行选项的设置,所以我们如果有兴趣就可以模拟实现cat、ls、echo等简单的命令

二、环境变量

1.PATH

相信大家在一开始学Linux的时候都有一个困惑,那就是命令行上的指令本质就是程序,我写的也是程序,为什么像ls、cat、touch等等命令的执行不用加./,而自己的程序运行要加呢?

本质在于程序的运行,首先要找到这个程序的位置,而如果我们就只写程序名,操作系统只会在PATH中的路径上查找该程序,如果找到了就会执行,没找到就无法执行,而我们自己写的程序一般都不在PATH的路径上,所以我们的程序执行要自带路径./

当然我们可以将程序的路径加入PATH中

或者我们也可以将程序拷贝到PATH中的某个路径中,这个操作其实就相当于简易版的安装,而将程序从这些路径中删除,就相当于卸载操作,一般不建议这么做。

当然不用担心PATH被修改之后改不回来,这里的PATH是内存中的值,磁盘中的PATH并没有改变重启Linux后就会恢复。


2.PWD

我们有一个命令pwd能打印我们当前所在目录,本质是pwd命令读取了环境变量PWD中的值


3.HOME

不同的用户登录,会出现在各自的家目录,如root出现在/root,普通用户出现在/home/username为什么?

在登录时

1、输入了用户名和密码

2、认证是否匹配

3、形成环境变量(PATH/HOME/PWD等等),根据用户名,初始化HOME


系统中会存在大量的环境变量,每个环境变量都有它自己的特殊用途,其他的环境变量如下

我们还可以在代码中获取环境变量来完成一些特定的功能,比如限制用户的权限


我们还能通过给main函数传参,来获得环境变量

注意:main函数的三个参数的顺序不能改变。

我们会发现父子进程的环境变量的值一样,其实环境变量存放在下面的这样一张表中,和命令行参数类似。

两者都可以通过父进程传递给子进程,我们知道子进程的命令行参数是我们在命令行输入的命令转化来的,那么环境变量又是从哪里来的呢?

其实在操作系统启动的时候,会有相关的配置文件导入环境变量,可以理解为初始化的过程,我们在根目录下,能找到.bash_profile这样一个隐藏文件

这个文件里面存一些脚本,每一次登录的时候,你的bash进程会读取并执行该配置文件的内容,为bash进程形成一张环境变量表信息

所以我们之前修改的环境变量本质是在修改上面的那张表上的内容,也就是修改bash进程的环境变量(在内存中),不会影响磁盘中的配置文件,所以重启系统之后,环境变量就又恢复到默认的状态了。

如果我们想让每次打开系统都会有,我们可以将他写入这个配置文件中

我们也可以手动给bash进程加入一些环境变量

我们创建的变量只是本地变量,可以用echo查看,但是不在环境变量表中,得通过export命令将他们导入环境变量表中(再次强调这里的环境变量表只是内存中的) 

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

在之前我们讲过父子进程数据共享,而环境变量也是属于进程的数据的,所以我们也可以不传参数来获取进程的环境变量,有一个全局的变量environ


上面这个本地变量,为什么能被echo打印,而不能被env打印?明明两个都是子进程,而本地变量不在环境变量中,所以子进程不应该能找到才对呀,那echo是怎么找到的?

其实Linux中的命令分为两个:

  • 常规命令,shell fork创建子进程,让子进程去执行
  • 内建命令,shell命令行的一个函数,当然可以直接读取shell内部定义的本地变量

而echo\export等就是内建命令,所以即使PATH="",它们也能执行 

和环境变量有关的命令

1. echo: 显示某个环境变量值
2. export: 设置一个新的环境变量
3. env: 显示所有环境变量
4. unset: 清除环境变量和本地变量
5. set: 显示本地定义的shell变量和环境变量

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

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

相关文章

修改第三方npm包

文章目录 一、前言二、补丁方案2.1、patch-package2.2、pnpm patch 三、换日方案四、总结五、最后 一、前言 在开发过程中,发现某个npm包有Bug,应该怎么办?可以试试下面这2种方案: 代码量少,可以直接修改npm包代码的&…

初入职场不会Git?经常被团队成员怼?手把手教你如何使用git

Git分支合并选择 简介: 用Git进行多人协作开发时,必然会合并代码,解决冲突。然而合并代码也是需要点技巧的,如果对一些关键命令没有理解去使用的话,git的版本演进路线就会变得很乱,从而造成了日后维护的一…

【svn】win11最新svn每天自动化定时update、commit,隐藏窗口,定时脚本编写

本文使用schtasks结合bat脚本实现全自动svn update以及commit操作。执行时隐藏cmd窗口,全自动后台执行。 执行脚本 写脚本参考了网上很多文章,但是这些文章的方法都有问题或者已经失效,比如: 老版本的bat脚本,使用v…

vscode不同代码的项目分配不同的工作区

vscode不同代码的项目分配不同的工作区 很多时候我们很多项目都需要使用vscode来进行编写代码,像我个人会拿vscode写python,linux远程写代码,前端和stm32的编辑器,这些项目都有自己的插件,如果我们启动某一个项目&…

JVM内存结构Java内存模型Java对象模型

悟空老师思维导图:https://naotu.baidu.com/file/60a0bdcaca7c6b92fcc5f796fe6f6bc9https://naotu.baidu.com/file/60a0bdcaca7c6b92fcc5f796fe6f6bc9 1.JVM内存结构&&Java内存模型&&Java对象模型 1.1.JVM内存结构 1.2.Java对象模型 Java对象模型…

SQL变更评审常见问题分享

SQL变更评审分享 概述 SQL变更,是我们在开发迭代中不可避免的场景,SQL变更通常是指DDL和DML语句变更,这些sql会影响到数据库表结构或具体数据,变更时如果执行到存在问题的sql脚本,会对实际应用操作难以评估的损失&…

JuiceSSH结合内网穿透实现公网远程访问本地Linux虚拟机

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

DHT11编程

实验:用数码管显示温湿度 dht11.h #ifndef _DHT11_H #define _DHT11_H #include "stm32f10x_conf.h"extern void dht11_init(void); extern void Get_Dht_Value(char *buf); #endifdht11.c #include"dht11.h" #include"bitband.h" …

Kylin-Desktop-V10-SP1-General-Release-2303-X86_64-海光版(hygon c86)镜像虚拟机安装

选择60G 自定义硬件 设置内存、cpu、网络为桥接 点击开启虚拟机 在下一步中输入用户名和密码 等待安装完成 取出安装介质:先关机,再按照下图操作 移除,并确认 再开机,等待启动成功 系统版本

04|提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案

04|提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案 当你用 print 语句打印出最终传递给大模型的提示时,一切就变得非常明了。 您是一位专业的鲜花店文案撰写员。 对于售价为 50 元的 玫瑰 &…

基于 Python 和Surprise库,新手轻松搭建推荐系统

解密基于用户的推荐系统。 1、简介 在数据时代,推荐系统是提升用户体验的重要工具。今天介绍如何使用亚马逊的电影评分数据集创建电影推荐系统。 2、数据加载与探索 首先,通过加载和探索数据集开启数据分析过程。首先导入Pandas和Numpy,这…

2024年【天津市安全员C证】找解析及天津市安全员C证模拟考试题

题库来源:安全生产模拟考试一点通公众号小程序 天津市安全员C证找解析考前必练!安全生产模拟考试一点通每个月更新天津市安全员C证模拟考试题题目及答案!多做几遍,其实通过天津市安全员C证模拟考试题库很简单。 1、【多选题】《建…