【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数

文章目录

  • 一、PATH环境变量
    • 1.什么是PATH环境变量
    • 2.如何添加PATH环境变量
    • 3.系统中的其他环境变量
    • 4.环境变量的来源
  • 二、环境变量的操作
    • 1.设置环境变量
    • 2.通过getenv获取环境变量
    • 3.环境变量的意义
  • 三、命令行参数

一、PATH环境变量

1.什么是PATH环境变量

这里我们先提出一个问题:为什么我们运行自己写的程序需要带路径,而系统的指令不需要带路径?

这是因为系统能找到它的位置,系统中是存在相关的环境变量,保存了程序的搜索路径的,系统中搜索可执行程序的环境变量叫做PATH。所以我们只需要把我们的程序拷贝到/usr/bin/路径下即可(但是我们不推荐,理由下面解释)

首先我们理解什么是环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数

如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

所以事实上,Linux中的各种指令本质上是/usr/bin目录下的一个个可执行的程序,和我们自己编写的可执行程序没有任何区别。但是使用指令的时候,系统会自动去PATH中寻找指令,如果找到了就执行,没有找到就报错-“command not found”,所以Linux中的各种指令不需要指定路径,而我们自己写的程序需要指定路径

2.如何添加PATH环境变量

我们可以使用如下指令来查看PATH环境变量中包含的内容:

echo $PATH

在这里插入图片描述

我们需要注意的是,PATH中不同的路径分隔符为:

我们也可以通过向PATH中添加内容让我们自己的程序可以不指定路径就能被执行

方法一:直接将程序添加到/usr/bin目录下(不建议使用这种方法,因为我们写的程序没有经过测试,可能会污染指令池)

在这里插入图片描述

我们删除使用如下指令:

sudo rm /usr/bin/mycmd

之后我们执行我们自己写的程序又需要带上路径

在这里插入图片描述

方法二:使用export命令将当前可执行程序的路径导入PATH

export PATH=$PATH:当前路径

在这里插入图片描述

【注意】

$PATH代表之前的PATH中的内容,:之后的尾新添加的内容,所以我们不能直接使用如下指令:

export PATH=当前路径

因为这样会将之前PATH中的内容覆盖掉,使得Linux中的各种指令必须指定目录才能执行,因为操作系在/usr/bin找不到系统中原来的指令了,此时,我们只需要重新登录即可,因为环境变量属于内存级变量,我们每次登录shell的时候,环境变量都会重新编译执行。同时,PATH中不能有空格,因为Linux中以空格作为分隔符

在这里插入图片描述

我们学过Java的同学都知道,我们在最开始学的时候需要在windows中配置环境变量,其实本质就是向PATH中添加内容(windows中的路径分隔符为分号)

windows下查看环境变量:

设置->关于->高级系统设置->环境变量

在这里插入图片描述

3.系统中的其他环境变量

PATH环境变量只是系统中众多环境变量的一种,除了PATH,我们还有许多其他环境变量,不同的环境变量有不同的功能,也适用于不同的场景

PATH : 指定命令的搜索路径

HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)

SHELL : 当前Shell,它的值通常是/bin/bash

HOSTNAME:主机名

USER:当前用户名

PWD:当前系统路径

HISTSIZE:shell能记住的最多的历史命令的数量

在这里插入图片描述

我们也可以使用env命令来查看系统中所有的环境变量:

在这里插入图片描述

4.环境变量的来源

我们使用“ ls - al /hone/hdp”指令就可以发现家目录下 存在两个隐藏文件–.bash_profile与.bashrc:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

实际上,我们在登录shell的时候,操作系统会让我们当前的shell进行执行.bash_profile文件内的内容,而.bash_profile又会调用执行.bashrc,他们会将对应的环境变量导入到shell进程的上下文环境中,所以,这样解释了为什么我们把$PATH覆盖了之后,重新登录shell之后就可以了

环境变量的定义

环境变量是操作系统为了满足不同的应用场景,预先在系统内设置一大批全局变量,这些变量往往具有特殊功能,且能够一直被bash以及bash的子进程访问。

环境变量具有全局属性的根本原因是环境变量会被子进程继承

二、环境变量的操作

1.设置环境变量

Linux命令行的可以定义变量的,但是我们以这种方式定义的变量吧本地变量,即只在bash进程中有效,而不是环境变量,因为环境变量具有全局属性

在这里插入图片描述

我们可以使用export直接定义环境变量,也可以使用它将已经存在的本地变量变成环境变量

在这里插入图片描述

我们可以使用set命令来查看所有变量,包括环境变量和本地变量,使用unset来取消变量,包括环境变量和本地变量

在这里插入图片描述

2.通过getenv获取环境变量

我们可以使用 echo $环境变量名 来获取特定的环境变量,也可以通过getenv()函数来获取环境变量:

在这里插入图片描述

其中name是我们需要获取环境变量的名称,如果获取成功就返回环境变量的具体内容,失败就返回NULL

这样我们就可以使用getenv()函数来编写系统中某些指令了,比如pwd:

#include <stdio.h>
#include <stdlib.h>
#define MYPWD "PWD"
int main()
{char* env = getenv(MYPWD);printf("%s\n",env);return 0;
}

在这里插入图片描述

3.环境变量的意义

我们知道,环境变量是操作系统为了满足不同的应用场景,预先在系统内设置的一大批全局变量,其中PATH就是为了满足我们指令路径搜索的需求,而除了指令需求之外还有许多其他需求,其中非常重要的一个就是身份认证

我们以一个例子说明:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define USER "USER"int main()
{char* who = getenv(USER);if(strcmp(who,"root")==0){printf("user:%s\n",who);printf("user:%s\n",who);printf("user:%s\n",who);printf("user:%s\n",who);printf("user:%s\n",who);}else{printf("权限不足\n");}return 0;
}

在这里插入图片描述

我们这里使用su -,而不是su,因为su -会重新登录shell,此时shell会重新加载环境变量,让$USER从hdp变成root,而su只是把用户身份切换为root

在这里插入图片描述

我们可以在程序内部通过getenv函数来获取当前Linux用户,然后判断其是否具备某种权限,再执行对应的操作

此外,我们还可以使用stat来获取一个文件的其他属性,比如读写执行等,然后根据这些属性判断一个用户是否能对该文件进行对应的操作

在这里插入图片描述

stat指令是一个用于显示文件或目录详细信息的命令,包括文件大小、创建时间、修改时间、访问时间和权限等。在Linux和Unix操作系统中,stat命令通常使用以下语法:

stat [选项] 文件名

其中,选项可以是以下之一:

  • -c:指定自定义格式输出。
  • -f:指定文件系统信息输出格式。
  • -t:指定时间格式输出。

三、命令行参数

我们出来可以通过getenv函数来获取环境变量,还可以通过命名行参数来获取环境变量

我们知道,C语言中的main函数是有参数的,这些参数可以通过命令行进行传递:

int main(int argc,char* argv[],char* env);

其中argc是一个整数,代表的是argv数组元素的个数,argv是一个指针数组,数组里面的每一个元素都指向一个字符串

我们可以打印argv数组中存放的环境变量,增加选项时环境变量也随之增加

#include <stdio.h>
#include <stdlib.h>int main(int argc,char* argv[],char* env[])
{int i = 0;for(i = 0; i < argc; ++i){printf("argv[%d]:%s\n",i,argv[i]);}return 0;
}

在这里插入图片描述

他们配合使用就可以实现类似于"ls -a -l -d"选项的功能,通过我们传递不同的选项使用不同的功能

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main(int argc,char* argv[],char* env[])
{if(argc != 2){printf("Usage: \n\t\%s [-a/-b/-c/-ab/-ac/-bc]\n",argv[0]);}if(strcmp("-a",argv[1]) == 0){printf("功能a\n");}if(strcmp("-b",argv[1]) == 0){printf("功能b\n");}if(strcmp("-c",argv[1]) == 0){printf("功能c\n");}if(strcmp("-ab",argv[1]) == 0){printf("功能ab\n");}if(strcmp("-ac",argv[1]) == 0){printf("功能ac\n");}if(strcmp("-bc",argv[1]) == 0){printf("功能bc\n");}return 0;
}

在这里插入图片描述

而指针数组env就是用于接受父进程传递过来的环境变量的参数,我们可以在main函数中打印env的内容:

#include <stdio.h>
#include <stdlib.h>int main(int argc,char* argv[],char* env[])
{int i = 0;for(i = 0; env[i]; ++i){printf("env[%d]:%s\n",i,env[i]);}return 0;
}

在这里插入图片描述

程序也可以通过环境表environ来获取环境变量–环境变量表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境变量字符串,每个进程都会收到一张环境变量表

在这里插入图片描述

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(int argc,char* argv[],char* env[])
{extern char** environ;int i = 0;for(i = 0; environ[i]; ++i){printf("%d:%s\n",i,environ[i]);}return 0;
}

在这里插入图片描述

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

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

相关文章

Ubuntu22.04离线安装uwsgi问题记录

GCC4.8安装 1、报错信息1&#xff1a; 由于缺少gcc4.8环境导致的无法安装uwsgi 解决方案&#xff1a; 离线安装GCC4.8环境, GCC4.8.5离线安装步骤如下&#xff1a; 1、下载gcc的离线安装包及其依赖包&#xff0c;链接如下&#xff1a; https://download.csdn.net/download/…

科技驱动固定资产管理变革:RFID技术的前沿应用

在当今激烈竞争的商业环境中&#xff0c;企业固定资产管理面临挑战&#xff0c;而RFID技术正以其独特特性和功能性彻底改变资产管理方式。本文将深入探讨RFID技术在固定资产管理中的革命性作用&#xff0c;并解析其应用带来的创新和便利。 RFID技术概述&#xff1a; RFID系统作…

君正X2100 读取CHIP_ID

每个处理器会有一个唯一的ID&#xff0c;这个ID可用做产品序列号&#xff0c;或其它。 X21000的CHIP_ID存放于芯片内部的efuse中&#xff0c;efuse是一次性可可编程存储器&#xff0c;初始值为全0&#xff0c;只能将0改为1&#xff0c;不能将1改为0。芯片出厂前会被写入一些信…

【开源】基于JAVA的智能停车场管理系统

项目编号&#xff1a; S 005 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S005&#xff0c;文末获取源码。} 项目编号&#xff1a;S005&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系…

bclinux aarch64 ceph 14.2.10 文件存储 Ceph File System, 需要部署mds: ceph-deploy mds

创建池 [rootceph-0 ~]# ceph osd pool create cephfs_data 64 pool cephfs_data created [rootceph-0 ~]# ceph osd pool create cephfs_metadata 32 pool cephfs_metadata created cephfs_metadata 64 报错 官方说明&#xff1a; 元数据池通常最多可容纳几 GB 的数据。为…

微软宣布计划在 Windows 10 版本 22H2 中引入 AI 助手 Copilot

根据之前的传言&#xff0c;微软宣布计划在 Windows 10 版本 22H2 中引入 AI 助手 Copilot。Copilot 将包含在 Windows 10 家庭版和专业版中。该更新的发布日期尚未公布&#xff0c;但预计将在不久的将来发布。 在一份新闻稿中&#xff0c;微软表示在向 Windows 11 用户提供 Co…

Netty传输object并解决粘包拆包问题

⭐️ 前言 大家好&#xff0c;笔者之前写过一篇文章&#xff0c;《Netty中粘包拆包问题解决探讨》&#xff0c;就Netty粘包拆包问题及其解决方案进行了探讨&#xff0c;本文算是这篇博客的延续。探讨netty传输object的问题。 本文将netty结合java序列化来传输object并解决粘包…

[PyTorch][chapter 63][强化学习-QLearning]

前言&#xff1a; 这里结合走迷宫的例子,重点学习一下QLearning迭代更新算法 0,1,2,3,4 是房间&#xff0c;之间绿色的是代表可以走过去。 5为出口 可以用下图表示 目录&#xff1a; 策略评估 策略改进 迭代算法 走迷宫实现Python 一 策略评估 强化学习最终是为了…

【网络奇遇记】那年我与计算机网络的初相识 —— 网络的体系结构

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. 常见的三种计算机网络体系结构1.1 开放系统互连参考模型1.2 TCP/IP参考模型1.3 原理参考模型 二…

golang学习笔记——斐波纳契数列

斐波纳契数列 编写一个程序来计算某个数字的斐波纳契数列。 斐波那契数列是一个数字列表&#xff0c;其中每个数字是前两个斐波那契数字之和。 例如&#xff0c;数字 6 的序列是 1,1,2,3,5,8&#xff0c;数字 7 的序列是 1,1,2,3,5,8,13&#xff0c;数字 8 的序列是 1,1,2,3,5…

【机器学习7】优化算法

1 有监督学习的损失函数 1.1 分类问题 对二分类问题&#xff0c; Y{1,−1}&#xff0c; 我们希望sign f(xi,θ)yi&#xff0c; 最自然的损失函数是0-1损失&#xff0c; 函数定义特点0-1损失函数非凸、非光滑&#xff0c;很难直接对该函数进行优化Hinge损失函数当fy≥1时&…

leetcode刷题日记:141. Linked List Cycle(环形链表)

这一题是给我们一个链表让我们判断这是否是一个环形链表&#xff0c;我们知道如果一个链表中有环的话这一个链表是没有办法访问到尾的&#xff0c; 假若有如图所示的带环链表&#xff1a; 我们从图示中很容易看出来这一个链表在访问的时候会在里面转圈&#xff0c;我们再来看看…

群晖Docker(Container Manager)中安装Home Assistant Container

群晖Docker&#xff08;Container Manager&#xff09;中安装Home Assistant Container 不要使用 套件里面的 Home Assistant&#xff0c;不利于后期拓展 方式一&#xff1a; docker run -d --name"home-assistant-1" -v /volume1/docker/homeassistant/config:/c…

前端实现页面内容的截图与下载(html2canvas)

今天是一个发文的好日子&#x1f600;~ &#x1f447;&#x1f447;&#x1f447; 一个需求&#xff0c;要截取页面中的内容并截图保存&#xff0c;来看一看我是怎么实现的吧&#xff1a; 这里需要使用到插件--html2canvas 1.安装并引入html2canvas npm install html2canv…

分类预测 | Matlab实现PSO-GRU-Attention粒子群算法优化门控循环单元融合注意力机制多特征分类预测

分类预测 | Matlab实现PSO-GRU-Attention粒子群算法优化门控循环单元融合注意力机制多特征分类预测 目录 分类预测 | Matlab实现PSO-GRU-Attention粒子群算法优化门控循环单元融合注意力机制多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现PSO…

Skywalking流程分析_8(拦截器插件的加载)

前言 在之前的文章中我们将&#xff0c;静态方法、构造方法、实例方法的增强逻辑都分析完毕&#xff0c;但在增强前&#xff0c;对于拦截类的加载是至关重要的&#xff0c;下面我们就来详细的分析 增强插件的加载 静态方法增强前的加载 //clazz 要修改的字节码的原生类 Sta…

【运维】-- 在线网络工具

1、https://ping.pe/ 一个免费的在线网络工具&#xff0c;可以帮助您检测和分析IP地址的连接情况。 这是搬瓦工官方做的一个 ping 在线测试网站工具。比较适合测试短时间的 ping 统计&#xff0c;并且在网页上以图表形式统计显示出来。 PS&#xff1a; a、丢包会以红色显示出…

C语言调用【Python3】

一、搭建编译环境 终端查询系统及软件版本dpkg -l 列出所有已安装的软件包 二、C语言中调用Python 使用 GCC编译并链接 Python 3.10 的共享库如何在C中获取和修改 sys.path 三、C语言调用无参python函数 四、C语言调用有参python函数 一、搭建编译环境 通过C语言调用Pyth…

【MySQL】事务(中)

文章目录 事务异常与产出结论手动提交 和自动提交 对 回滚的区别 事务隔离性理论如何理解隔离性&#xff1f;MySQL的隔离级别事务隔离级别的查看设置隔离级别 事务异常与产出结论 在没有启动事务之前&#xff0c;account表中存在孙权和刘备的数据 在启动事务后&#xff0c; 向 …

PyTorch - 高效快速配置 Conda + PyTorch 环境 (解决 segment fault )

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134463035 在配置算法项目时&#xff0c;因网络下载速度的原因&#xff0c;导致默认的 conda 与 pytorch 包安装缓慢&#xff0c;需要配置新的 co…