【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;
}

在这里插入图片描述

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

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

相关文章

一起学docker系列之三docker的详细安装步骤

目录 前言1. 准备环境2. 卸载已有的Docker3. 安装编译工具4. 安装必需的软件5. 配置镜像仓库6. 更新YUM软件包索引7. 安装Docker CE8. 启动Docker9. 测试Docker10. 卸载Docker结语 前言 安装Docker是一项重要的任务&#xff0c;因为它为应用程序提供了容器化的环境&#xff0c…

uni-app开发微信小程序 vue3写法添加pinia

说明 使用uni-app开发&#xff0c;选择vue3语法&#xff0c;开发工具是HBliuderX。虽然内置有vuex&#xff0c;但是个人还是喜欢用Pinia&#xff0c;所以就添加进去了。 Pinia官网连接 添加步骤 第一步&#xff1a; 在项目根目录下执行命令&#xff1a; npm install pinia …

【无标题】chapter6卷积

此例以说明全连接层处理图片的时候会遇到参数过多 模型过大的问题 参数比要研究的物体总数还多 卷积&#xff0c;特殊的全联接层 平移不变形&#xff0c;局部性 原本权重为二维&#xff08;输入和输出全联接&#xff0c;想想下表组合&#xff0c;就是个二维的矩阵&#xff09;…

Scrapy----Scrapy简介

文章目录 概述与应用背景架构和组件功能和特点社区生态概述与应用背景 Scrapy,一个高效、灵活、且强大的Web爬取框架,被广泛应用于数据抓取和网页内容的结构化提取。它是用Python编写的,支持多平台运行,适用于数据挖掘、在线零售信息收集、历史数据存档等多种场景。Scrapy…

idea运行项目之后一直卡在Writing classes… 解决方案

最近遇到idea里直接运行一个Spring boot项目后&#xff0c;idea一直慢悠悠的parsing java&#xff0c;然后就writing classes&#xff0c;然后就一直卡着不动了&#xff0c;运气好10几分钟能把项目启动起来。 多年的摸鱼经验告诉我&#xff0c;事出反常必有妖&#xff0c;赶紧…

【Java】详解多线程通信

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;什么都不做&#xff0c;才会来不及 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ 文章目录 &#x1f510;多…

求10的阶乘之和

这个问题很简单&#xff0c;我们用for循环就可以做到&#xff01; 目录 1.用两个for循环求值 2.用一个for循环求值 1.用两个for循环求值 int main() {int i 1;int ret 1;int sum 0;int n 0;for (n 1; n < 10; n){ret 1;for (i 1; i < n; i){ret ret * i;}sum …

文件传输客户端 SecureFX mac中文版支持多种协议

SecureFX mac是一款功能强大的文件传输客户端&#xff0c;可在 Mac 操作系统上使用。它由 VanDyke Software 公司开发&#xff0c;旨在为用户提供安全、可靠、高效的文件传输服务。 SecureFX 支持多种协议&#xff0c;包括 SFTP、SCP、FTP、FTP over SSL/TLS 和 HTTP/S。它使用…

Django 配置 Email Admin 详细指南

概要 Django 是一个高级的 Python Web 框架&#xff0c;它鼓励快速开发和清洁、实用的设计。当你正在开发一个 Django 项目时&#xff0c;监控网站的运行情况是非常必要的。Django 提供了一个功能强大的 admin 界面&#xff0c;但同时也可以通过配置 email admin 来获取网站的…

第9章 K8s进阶篇-持久化存储入门

9.1 k8s存储Volumes介绍 Container&#xff08;容器&#xff09;中的磁盘文件是短暂的&#xff0c;当容器崩溃时&#xff0c;kubelet会重新启动容器&#xff0c;但最初的文件将丢失&#xff0c;Container会以最干净的状态启动。另外&#xff0c;当一个Pod运行多个Container时&…

设计模式解码:软件工程架构的航标

引言 软件工程领域的设计模式&#xff0c;就像是建筑师手中的设计蓝图&#xff0c;它们是经验的总结&#xff0c;指导开发者如何在面对层出不穷的编程难题时&#xff0c;构建出既稳固又灵活的软件结构。就像一座经过精心设计的大厦能够经受住风雨的考验一样&#xff0c;一个利用…

MAC地址注册的网络安全影响和措施分析

MAC地址注册对网络安全具有重要影响&#xff0c;同时也需要采取相应的措施来应对潜在的安全风险。以下是有关MAC地址注册的网络安全影响和应对措施的分析&#xff1a; 影响&#xff1a; 1. 身份验证&#xff1a;MAC地址注册可用于设备的身份验证&#xff0c;但MAC地址本身并不…

MATLAB 机械臂逆运动学进行轨迹控制建模

系列文章目录 文章目录 系列文章目录前言一、模型概览1.1 Target Pose Generation 目标姿势生成1.2 Inverse Kinematics 逆运动学1.3 Manipulator Dynamics 机械手动力学1.4 Pose Measurement 姿势测量 二、机械手定义三、生成航点四、模型设置五、模拟机械手运动六、将结果可视…

how to find gcc openbug

https://gcc.gnu.org/bugzilla/query.cgi?formatadvanced

“开源 vs. 闭源:大模型的未来发展趋势预测“——探讨大模型未来的发展方向

文章目录 每日一句正能量前言什么是大模型的开源与闭源开源与闭源的定义和特点开源的意义开源和闭源的优劣势比较不同的大模型企业&#xff0c;开源、闭源的策略不尽相同。开源vs 闭源&#xff1a;两者并非选择题后记 每日一句正能量 依赖别人的人等于折断了自己的翅膀&#xf…

SQL中的数据类型和规范化,助力数据存储优化

大家好&#xff0c;目前优化数据存储对于获得良好的性能始终至关重要&#xff0c;选择合适的数据类型并应用正确的规范化过程对于决定其性能至关重要。本文将介绍最重要和最常用的数据类型和规范化过程。 一、SQL中的数据类型 SQL中主要有两种数据类型&#xff1a;字符串和数…

【文献阅读】Self similarity driven color demosaicking

[PDF][Code] 1. 摘要 每个像素只测量一种颜色成分&#xff0c;红色、绿色或蓝色&#xff0c;人们可以在每个像素推断出整个颜色信息。这种推断需要深刻理解颜色之间的相互作用&#xff0c;以及图像局部几何的参与。虽然在以非常小的相对误差进行这种推断方面非常成功&#xff…

深入C++ Vector:解密vector的奥秘与底层模拟实现揭秘

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; &#x1f354;前言&#xff1a; 我们学习了STL中的string以及其所有重要接口并进行了模拟实现&#xff0c;但是STL中包含的内容不止于此。学习了string之后继续学习STL中的vector&#xff0c;学习成本会大大降低&#…

Notepad++ 和正则表达式 只保留自己想要的内容

一、需求 如下文本&#xff0c;三段相同结构的数据&#xff0c;想要获取每段结构中‘重复的Ids ’后面的数字 2023-10-26 18:49:49 重复的Ids 26443,26575 要删除的Ids 4174,4199,4200,55502023-10-26 18:49:49 重复的Ids 26436,26443,26575 要删除的Ids 4166,4199,4200,5550…

Docker(镜像、容器、仓库)工具安装使用命令行选项及构建、共享和运行容器化应用程序

文章目录 前言&#x1f31f;一、Docker工具安装&#x1f31f;二、Docker命令行选项&#x1f30f;2.1.docker run命令选项&#xff1a;&#x1f30f;2.2.docker build命令选项&#xff1a;&#x1f30f;2.3.docker images命令选项&#xff1a;&#x1f30f;2.4.docker ps命令选项…