Linux环境变量与命令行参数

Linux环境变量与命令行参数

  • 一.命令行参数
    • 1.语法
    • 2.应用1:简易计算器
  • 二.环境变量
    • 1.环境变量的概念
    • 2.环境变量的作用
    • 3.进一步理解环境变量的作用
    • 4.常见环境变量
    • 5.导出环境变量(添加环境变量)
    • 6.环境变量的特性
    • 7.另一种获取环境变量的方式
    • 8.小功能:用于身份验证的代码
    • 9.补充:第三种获取环境变量的方式
      • 1.environ
    • 10.本地变量
      • 1.本地变量的基本操作
        • 1.创建本地变量
        • 2.验证本地变量的特性
        • 3.移除本地变量
    • 11.环境变量是如何发挥作用的?

学习命令行参数对我们学习环境变量有很好地帮助
而且学习命令行参数能够让我们对于Linux操作系统和main函数有更加深刻的理解

一.命令行参数

命令行参数是Linux指令选项的基础
很多语言都支持这个功能,
因为它的作用是让同一个程序能够实现不同的子功能
作用很棒

正是因为有命令行参数这个语法的存在,才有了
ls -a
ls -l
ls -d
ls -n
gcc -E/S/c -o -g -static
等等这些指令的选项!!!

那么下面就让我们进入到命令行参数和环境变量的探索当中吧!

1.语法

大家可能见过main函数一个版本是有多个形参的
就像这样

int main(int argc,char* argv[]);
argc是int类型的变量
argv是一个指针数组,只不过传参时因为数组降维而让argv这个形参成为了二级指针
不过无妨,我们依然可以把它当成一个指针数组来遍历这个指针数组中存放的是char*类型的指针
这些指针指向的是字符串,因此用%s来打印即可

这两个东西到底是什么呢?
下面我们打印一下看一看
在这里插入图片描述
在这里插入图片描述
argv[0]就是我们输入的./mycmd这个字符串
其实我也可以这样来输入:
在这里插入图片描述
也就是说这个argv存放的就是我们在命令行中执行这个可执行程序时所输入的字符串
argc就是这个argv数组的有效数据的个数

其实这个argv是以NULL指针结尾的
我们来验证一下
因为NULL的字面值就是0,因此可以这样来验证
在这里插入图片描述
在这里插入图片描述
成功运行
这个就是命令行参数的语法
那么有什么用呢?
下面我们就来看一下这个用途

2.应用1:简易计算器

实现一个可以带选项执行不同功能的简易计算器

这里我们需要用到一个函数:atoi
用来将字符串转为整数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
成功运行
这也就是Linux中指令选项的实现方式

二.环境变量

1.环境变量的概念

在这里插入图片描述

2.环境变量的作用

我们知道:
执行一个程序必须要先找到这个程序
才能创建进程,形成PCB,加载到内存,映射地址空间,添加到运行队列当中
然后就能运行了

但是有一个问题:
为什么我们自己的程序必须要./(告诉系统我这个程序在这个路径下)呢
为什么系统指令就不用告诉系统它在哪个路径下呢?

因为:
系统中有一个全局环境变量PATH
执行程序时,操作系统会先到PATH所保存的路径当中查找该指令
找到了就可以执行,找不到就需要我们自己提供路径,否则就会:command not found
而我们的可执行程序的路径大多数情况下是不在PATH中的

echo $环境变量  查看环境变量的内容
echo $PATH
显示出来的路径是以:作为分隔符的

我们来看一下这个PATH的值是什么
我又新建一个目录process3
在里面写了一个code.c
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.进一步理解环境变量的作用

如果我想让自己的可执行程序不用加./就能跑呢?

方法1:拷贝到usr/bin下(不建议)

这个拷贝的过程就相当于把我们自己的指令/软件安装到系统当中

方法2:添加环境变量

PATH=我们的可执行程序的路径:$PATH

注意:
最后的:$PATH一定不能忘掉!!!
否则PATH直接全改了

如果真的改了
怎么办呢?
直接关掉,重新登陆,就没事了
因为我们改的是在内存当中改的,磁盘当中没有改
每次重新登录的时候环境变量会重新初始化的

下面我们就来演示一下第二种方式
在这里插入图片描述
试想一下:
如果没有PATH呢?
下面我把PATH直接清空
在这里插入图片描述
在这里插入图片描述
此时我
直接使用ls,clear,mkdir,touch都没法执行
但是pwd却可以执行(为什么呢?我们下面就会说明)
但是大多数指令都无法直接输入指令名称来运行了
在这里插入图片描述
此时我只能指定路径名称来运行
那是不是太不方便了
因此我们就能知道PATH的作用了
可见环境变量是非常重要的!!

4.常见环境变量

env  作用:查看环境变量

在这里插入图片描述

echo $PWD
因此pwd这个命令实际是通过读取环境变量得到的
因此我们刚才把PATH置空导致很多命令都无效的时候
pwd却可以正常运行echo $USER
记录用户名
whoamiecho $HOME
记录当前用户的家目录
cd ~ echo $SHELL
记录当前用户所用的命令行解释器
默认为
/bin/bash

在这里插入图片描述
在这里插入图片描述
登陆的时候,操作系统就会把当前用户相关的环境变量加载到内存的
系统通过环境变量就能认识你
(类似于公司的工牌)
也正是因为这些环境变量
所以我们在刚登陆Xshell之后,就会自动进入我们的家目录
并且系统也能知道我们的用户名是wzs
而且它也能随时知道我们当前所处的路径(pwd)

5.导出环境变量(添加环境变量)

export AGE=20
比方说我们就在这里添加一个环境变量AGE,让它的值定义为20
env

在这里插入图片描述
不过
让我退出Xshell再次登陆之后,刚才添加的AGE这个环境变量就会消失了
因为我们改的是在内存当中改的,磁盘当中没有改
每次重新登录的时候环境变量会重新初始化的
在这里插入图片描述

6.环境变量的特性

其实,我们的main函数还有一个参数:

int main(int argc,char* argv[],char* env[]);env这个数组当中存放的就是
指向环境变量的字符串的指针我们也可以来查看一下所有的环境变量
env[i]也是以NULL结尾

注意:

1.系统会把环境变量以main函数的参数传入的

在这里插入图片描述
在这里插入图片描述
跟刚才使用env命令查看所有的环境变量是一样的

2.环境变量是可以被子进程继承下去的(也就是说环境变量是全局的)

其实我们所写的所有进程都是子进程,
因为它们(不包括由我们所写的进程所创建的进程)的父进程都是bash
也就是说bash就是把它的环境变量通过main函数传参给了我们所写的进程

下面我们来使用fork(创建子进程)验证一下
在这里插入图片描述
只让子进程打印env
在这里插入图片描述
成功继承
可是
这种获取环境变量的方式获取的也太多了吧
看着好乱啊
能不能可以只获取指定的环境变量呢?
当然可以啦

7.另一种获取环境变量的方式

getenv函数:获取指定的环境变量

在这里插入图片描述
下面我们来演示一下
在这里插入图片描述
在这里插入图片描述
成功获取当前运行这个mycmd的用户的名称
下面我切换为zs,来看一下会打印出zs来吗?
在这里插入图片描述
同理,对于root来说也是如此

8.小功能:用于身份验证的代码

下面我们就可以根据这个用户名这个环境变量来写一份代码了
这个代码的功能是
让别人"无法"执行我这个mycmd
一个身份验证的代码

我切换回wzs,开始写代码
在这里插入图片描述
只有wzs这个用户才可以执行这个程序
其他用户执行这个程序就会强制退出
1.wzs可以执行:
在这里插入图片描述
2.zs无法执行:
在这里插入图片描述
尽管zs作为other还有x权限,但是zs也"无法"执行我这个程序

3.root无法执行:

你以为这个代码只能管得了zs?
错了,root想执行也"执行"不了
在这里插入图片描述
可见这个环境变量的确很有用哦

9.补充:第三种获取环境变量的方式

1.environ

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
成功显示
只需要注意使用时要先用extern来声明

10.本地变量

本地变量区分于环境变量
本地变量是不会被子进程继承的,只在bash内部有效的变量
下面我们来看一下本地变量的基本操作

1.本地变量的基本操作

1.创建本地变量

其实方法很简单,比方说我现在想要创建一个本地变量
myname,赋值为wzs

只需要在命令行中输入:
myname=wzs

在这里插入图片描述
可见,myname这个本地变量创建成功
的确在bash内部是有效的

2.验证本地变量的特性

你不是说本地变量并不会被子进程继承吗
那么现在这个本地变量myname是在bash中的
只要我创建一个进程,查看它的环境变量当中是否有myname不就行了吗?
因此,我们来查看一下
在这里插入图片描述
如果有myname这个环境变量,那么就会打印
myname is …
否则打印myname not found
在这里插入图片描述
可见,本地变量的确是不会被子进程继承的

3.移除本地变量

无论是本地变量还是环境变量都可以这样移除

unset 本地变量名或者是环境变量名

下面我来移除一下myname

unset myname

在这里插入图片描述
移除成功

11.环境变量是如何发挥作用的?

我们所创建的进程中的这些环境变量都来自于它们的祖先(bash这个进程),
因此,只需要bash这个进程有这些环境变量,呢吗环境变量就可以被所有的进程所继承下去,因此就能发挥作用了

但是:
每当我们登录Xshell的时候
系统会给我们分配一个bash
而我们的环境变量就在bash当中
但是bash中的环境变量是在哪里拿的呢?

是从磁盘中的某些脚本文件或者配置文件中来的
每次启动时都会从磁盘的文件中加载到内存当中
这样就可以给bash了
其中有几个文件就是
~/.bash_profile
~/.bashrc
/etc/bashrc
分别是当前用户家目录下的.bash_profile .bashrc
还有/etc目录下的bashrc等等文件

下面我们来简单的看一下即可
注意:一定不要乱修改这些配置文件,否则会出现比较严重的问题
在这里插入图片描述
家目录下的.bash_profile
在这里插入图片描述
这里就是导入PATH这个环境变量的配置文件
家目录下的.bashrc
这个是因为我之前给wzs用户自动化配置过vim,因此改了一些配置文件
在这里插入图片描述

etc目录下的.bashrc
在这里插入图片描述
我们只需要知道bash当中的环境变量是从配置文件或者脚本文件中读取的即可

以上就是Linux环境变量与命令行参数的全部内容,希望能对大家有所帮助

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

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

相关文章

Android--Jetpack--Lifecycle详解

富贵本无根,尽从勤里得 一,定义 Lifecycle 是一个具备宿主生命周期感知能力的组件。它持有组件(Activity/Fragment)生命周期状态信息,并且允许其观察者监听宿主生命周期状态变化。 顾名思义,Lifecycle的主…

【3DsMax】制作简单的骨骼动画

效果 步骤 首先准备4个板子模型展开放置好 添加一个4段的骨骼 选中其中的一块板子添加蒙皮命令 在蒙皮的参数面板中,设置每块板子对应哪块骨骼 设置好后你可以发现此时就已经可以通过骨骼来控制模型了 接下来就可以制作动画 点击左下角“时间配置”按钮 设置一下动…

网络程序设计

互相连接,发送信息 tcp和udp协议 tcp会有准备,udp不会准备。 8080端口:tomcat端口,java和web相连接 80端口:http 21端口:ftp 套接字 socket:提供给程序可以对外进行连接的接口 ip地址 …

Elk:filebeat 日志收集工具和logstash

Filebeat是一个轻量级的日志收集工具,所使用的系统资源比logstash部署和启动时使用的资源要小得多 Filebeat可以在非java环境使用,他可以代理logstash在非java环境上收集日志 缺点Filebeat无法实现数据的过滤,一般是结合logstash的 实验 ELK 企业级日志分析系统---…

Java第二十一章网络通信

一、网络程序设计基础 1、局域网与互联网 为了实现两台计算机的通信,必须用一个网络线路连接两台计算机,如下图所示。 2、网络协议 1.IP协议 IP指网际互连协议,Internet Protocol的缩写,是TCP/IP体系中的网络层协议。设计IP的目的…

C++ 拷贝构造函数

目录 拷贝构造函数概述 拷贝构造函数特性 拷贝构造函数概述 当我们定义好一个类,不做任何处理时,编译器会自动生成以下6个默认成员函数: 默认成员函数:如果用户没有手动实现,则编译器会自动生成的成员函数。 同样&…

Centos图形化界面封装OpenStack Ubuntu镜像

目录 背景 环境 搭建kvm环境 安装ubuntu虚机 虚机设置 系统安装 登录虚机 安装cloud-init 安装cloud-utils-growpart 关闭实例 删除细节信息 删除网卡细节 使虚机脱离libvirt纳管 结束与验证 压缩与转移 验证是否能够正常运行 背景 一般的镜像文件在上传OpenSt…

DBSCAN聚类算法学习笔记

DBSCAN聚类算法学习笔记 一些概念名词 MinPts:聚类在一起的点的最小数目,超过这一阈值才算是一个族群 核心点:邻域内数据点超过MinPts的点 边界点:落在核心点邻域内的点称为边界点 噪声点:既不是核心点也不是边界点的…

校园教务管理系统

学年论文(课程设计) 题目: 信息管理系统 校园教务管理系统 摘要:数据库技术是现代信息科学与技术的重要组成部分,是计算机数据处理与信息管理系统的核心,随着计算机技术的发展,数据库技…

OCP Java17 SE Developers 复习题08

答案 答案 答案 A. This code is correct. Line 8 creates a lambda expression that checks whether the age is less than 5, making option A correct. Since there is only one parameter and it does not specify a type, the parentheses around the parameter are …

h5如何跳转到微信公众号中

需求:点击按钮或者某个地方,弹出关注公众号的页面。(h5跳转到微信公众号) 需要什么:通过window.location.href来进行跳转。 因此,需要一个微信公众号链接。 一、打开想要跳转到的微信公众号的任何一篇文章&…

单片机_RTOS_架构

一. RTOS的概念 // 经典单片机程序 void main() {while (1){喂一口饭();回一个信息();} } ------------------------------------------------------ // RTOS程序 喂饭() {while (1){喂一口饭();} }回信息() {while (1){回一个信息();} }void main() {create_task(喂饭);cr…

一网打尽损失函数和正则化的关系,在损失函数中加入正则化有什么用,如何加入,这里为大家用通俗易懂的例子进行详细解释!(系列1)

文章目录 一、BP神经网络预测中,常见的损失函数是均方误差损失函数MSE二、L2正则化的公式如下:三、 结合MSE和L2正则化的总损失函数公式如下:总结 一、BP神经网络预测中,常见的损失函数是均方误差损失函数MSE 在BP神经网络预测中…

气膜厂家怎样确保产品质量和售后服务?

气膜厂家作为一家专业生产气膜产品的企业,确保产品质量和提供良好的售后服务是我们的责任和使命。为了确保产品质量和售后服务的可靠性,我们采取了以下措施。 起初,我们严格按照国家标准和相关行业规范进行生产。气膜产品的质量是产品能否长…

【JavaEE进阶】 Spring 的创建和使⽤

文章目录 🌴前言🎋创建 Spring 项⽬🚩创建⼀个 Maven 项⽬🚩添加 Spring 框架⽀持🚩添加启动类 🌳存储 Bean 对象🚩创建Bean🚩将 Bean 注册到容器 🌲获取并使⽤ Bean 对象…

图解系列--Web服务器,Http首部

1.用单台虚拟主机实现多个域名 HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点。。比如,提供 Web 托管服务(Web Hosting Service)的供应商,可以用一台服务器为多位客户服务,也可以以每位客户持有的域名运行各自不…

VSCode之C++ CUDA入门:reduce的N+1重境界

背景 Reduce是几乎所有多线程技术的基础和关键,同样也是诸如深度学习等领域的核心,简单如卷积运算,复杂如梯度聚合、分布式训练等,了解CUDA实现reduce,以及优化reduce是理解CUDA软硬件连接点的很好切入点。 硬件环境&…

模式识别与机器学习(七):集成学习

集成学习 1.概念1.1 类型1.2 集成策略1.3 优势 2. 代码实例2.1boosting2.2 bagging2.3 集成 1.概念 集成学习是一种机器学习方法,旨在通过组合多个个体学习器的预测结果来提高整体的预测性能。它通过将多个弱学习器(个体学习器)组合成一个强学…

空间金字塔池化(SPP,Spatial Pyramid Pooling)系列

空间金字塔池化的作用是解决输入图片大小不一造成的缺陷,同时在目标识别中增加了精度。空间金字塔池化可以使得任意大小的特征图都能够转换成固定大小的特征向量,下面针对一些典型的空间金字塔进行盘点。 部分图片来自blog:空间金字塔池化改进 SPP / SP…

Jmeter接口自动化测试 —— Jmeter断言之Json断言

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…