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
记录用户名
whoami

echo $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环境变量与命令行参数的全部内容,希望能对大家有所帮助

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

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

相关文章

Elasticsearch:什么是机器学习?

机器学习定义 机器学习 (ML) 是人工智能 (AI) 的一个分支,专注于使用数据和算法来模仿人类的学习方式,并随着时间的推移逐渐提高准确性。 计算机科学家和人工智能创新者 Arthur Samuel 在 20 世纪 50 年代首次将其定义为 “赋予计算机无需明确编程即可学…

C 语言实现TCP 通信,以及地址复用

服务端 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <arpa/inet.h>int main() {//监听套接字文件描述符int listenFd -1;//连接套接字的文件描述符int connFd -1;//服务器的地址结构st…

html实现好看的个人博客留言板源码

文章目录 1.设计来源1.1 博客主界面1.2 常用源码1.3 我的文章1.4 留言板1.5 联系我 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134837482 html实现好看的个人博客留言…

(C语言)判定同数异形体

同数异形体&#xff1a;有相同的数字包括数字个数&#xff0c;不同排列形成的正整数。 例如&#xff1a;12334和33214均由1个1,1个2,2个3,1个4组成&#xff0c;故互为同数异形体&#xff0c;而1234和3221就不是。 #include<stdio.h> bool Isomorphism(int num1,int num…

js二维数组实现纵向求和

需求&#xff1a;横向纵向都可以求和&#xff0c;剩余分数为100减去纵向之和 var arr [{id: 张丹,rowInfo: [{ realScore: 12 },{ realScore: 34 },{ realScore: 0 },{ realScore: 0 },{ realScore: 0 },],},{id: 丽丽,rowInfo: [{ realScore: 0 },{ realScore: 0 },{ realSc…

2023年最详细介绍Linux 系统目录结构!你确定不来了解一下吗?

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有…

Python实现FA萤火虫优化算法优化Catboost回归模型(CatBoostRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

一文带你区分Cookie 和 Session

Cookie 和 Session HTTP 协议是一种无状态协议&#xff0c;即每次服务端接收到客户端的请求时&#xff0c;都是一个全新的请求&#xff0c;服务器并不知道客户端的历史请求记录&#xff1b; Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性 1、Session 是什么 …

IDEA导入JavaWeb项目(Maven)

IDEA导入JavaWeb(Maven)项目教程 运行教程 亲爱的粉丝们&#xff0c;我深知你们对IDEA导入JAVAWeb工程的迫切需求。在这个充满竞争的时代&#xff0c;每一个项目都离不开高效的沟通。过程中需要对应的环境适配和软件安…

openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复

文章目录 openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复146.1 背景信息146.2 前置条件146.3 操作步骤146.4 示例 openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复 146.1 背景信息 在openGauss使用过程中&#x…

class051 二分答案法与相关题目【算法】

class051 二分答案法与相关题目【算法】 算法讲解051【必备】二分答案法与相关题目 code1 875. 爱吃香蕉的珂珂 // 爱吃香蕉的珂珂 // 珂珂喜欢吃香蕉。这里有 n 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉 // 警卫已经离开了&#xff0c;将在 h 小时后回来。 // 珂珂…

生成对抗网络——研讨会

时隔一年&#xff0c;再跟着李沐大师学习了GAN之后&#xff0c;仍旧没能在离散优化中实现通用的应用&#xff0c;实在惭愧&#xff0c;借着组内研讨会的机会&#xff0c;再队GAN的前世今生做一个简单的综述。 GAN产生的背景 目前与GAN相关的应用 去reddit社区的机器学习板块…

外汇天眼:SEC(美国证券交易委员会)获得对Lupo Securities的最终判决

美国证券交易委员会&#xff08;SEC&#xff09;已获得对Lupo Securities LLC的最终判决。 2023年12月4日&#xff0c;伊利诺伊州北区法院的尊敬的约翰罗伯特布雷基法官签署了有关Lupo Securities的最终判决。 法院命令被告永久受限制和禁止违反《证券交易法》&#xff08;“…

简单地将附件POST到Notes应用中

大家好&#xff0c;才是真的好。 这半年我们会讲很多开发知识&#xff0c;这篇紧接上篇《通过URL将HTML表单数据创建到Domino应用中》&#xff0c;讲述如何将附件POST到Note应用中。 原理是一样&#xff0c;首先&#xff0c;你得有一个表单&#xff0c;我们用html写一个&…

uniapp打包iOS应用并通过审核:代码混淆的终极解决方案 ✨

摘要 本篇博客将教你如何使用 JavaScript-obfuscator 插件来一键发行和混淆 iOS 上的 uniapp 代码。通过安装插件、创建运行脚本&#xff0c;并执行混淆操作&#xff0c;你将能够轻松通过审核&#xff0c;提高应用程序的安全性。&#x1f512; 引言 在将 uniapp 项目打包并上…

【二分答案法】寻找峰值

题目&#xff1a;162. 寻找峰值 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 题目分析&#xff1a; &#xff08;1&#xff09;据题知&#xff0c;索引-1、索引n&#xff08;n为数组长度&#xff09;处的元素都默认为无穷小&#xff0c;我们可以在一开始特判…

逻辑漏洞之越权漏洞

一、越权漏洞简介 越权访问&#xff08;Broken Access Control&#xff0c;简称 BAC&#xff09;是Web应用程序中一种常见的漏洞。它的威胁在于一个账户即可控制全站用户数据。 该漏洞是指应用在检查授权时存在纰漏&#xff0c;使得攻击者在获得低权限用户账户后&#xff0c;利…

计算机网络:传输层(TCP详解)

文章目录 前言一、面向连接传输TCP1.段结构TCP往返延时&#xff08;RTT&#xff09;和超时 2.可靠数据传输TCP发送方事件TCP重传产生TCP ACK的建议[RFC 1122. RFC 2581]快速重传 3.流量控制4.TCP连接管理同意建立连接&#xff08;2次握手&#xff09;TCP三次握手TCP关闭连接&am…

JavaScript <有道翻译之数据解密‘23年12月06日版‘>--案例(三)

前言: 记得上半年还是去年,有道翻译还是直接返回明文数据;现在也跟着,用接口返回加密数据了; 娱乐一下,破他的密文数据... 成品效果图: js部分: 对于找他的密文数据有点费时,针对密文--->搜他地址和启动器不是特别容易,辗转多时(搜:descrypt/json.parse 结合使用更快),有图…

Linux环境下的MySQL安装

文章目录 前提说明1.卸载内置环境2.检查系统安装包3.卸载这些默认安装包4.获取MySQL官方yum源5.安装MySQLyum源&#xff0c;对比前后yum源6.查看yum源是否生效7.安装MySQL服务8.查看相对应的配置文件9.启动服务10.查看启动服务11.登录方法一12.登录方法二13.登录方法三14.设置开…