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

这篇具有很好参考价值的文章主要介绍了【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、PATH环境变量

1.什么是PATH环境变量

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

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

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

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

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

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

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

2.如何添加PATH环境变量

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

echo $PATH

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

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

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

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

我们删除使用如下指令:

sudo rm /usr/bin/mycmd

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

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

export PATH=$PATH:当前路径

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

【注意】

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

export PATH=当前路径

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

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

windows下查看环境变量:

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

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

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

PATH : 指定命令的搜索路径

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

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

HOSTNAME:主机名

USER:当前用户名

PWD:当前系统路径

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

4.环境变量的来源

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

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

环境变量的定义

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

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

二、环境变量的操作

1.设置环境变量

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

2.通过getenv获取环境变量

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,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;
}

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

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

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

他们配合使用就可以实现类似于"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;
}

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

而指针数组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;
}

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv

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

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数,Linux系统编程,linux,PATH,环境变量,命令行参数,getenv文章来源地址https://www.toymoban.com/news/detail-758276.html

到了这里,关于【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】进程优先级 && 命令行参数 && 环境变量

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一、进程优先级 1.1、进程优先级的基本概念 1.2、优先级 VS 权限 1.3、为什么要有优先级? 1.4、Linux的优先级的特点 查看方式 1.5、PRI and NI 1.6、用top命令更改已存在进程的nice 1.7、其

    2024年03月25日
    浏览(42)
  • 【Linux系统编程】环境变量详解

    我们在学校学习某些编程语言比如Java、python,一开始在配置环境的时候基本上都会做一件事情就是配置环境变量。 那我们当时往往都是按照老师的指导或者跟着网上的一些教程直接就把它配置了,但是,我们可能并不明白配置这个环境变量到底是干啥的,它到底有什么作用

    2024年01月21日
    浏览(49)
  • 【Linux系统编程】环境变量的组织方式

    environ和getenv函数          在Linux中,environ是一个全局的外部变量,其类型为char**,存储着系统的环境变量。除了使用主函数中的第三个参数外,我们也可使用environ函数直接访问系统的环境变量。         注意:这里在代码内部使用environ时,需要先定义environ。在系统

    2024年01月18日
    浏览(258)
  • QT设置二级菜单 QT获取命令行参数 QT获取系统环境变量 QT QStatusBar showMessage的坑

    提示: 可以使用 qss 或者一些接口函数对 QMenu 和 QAction 进行美化 在操作过程中,最开始使用的QT的GUI程序,因为GUI程序默认的标准输出是QTCREATOR的应用程序输出窗口,所以在命令行窗口是看不到的,但是这也是可以配置的qt在GUI显示时,将调试信息输出到控制台的设置。以上

    2023年04月09日
    浏览(49)
  • Mac 上更新系统PATH环境变量

    通常在安装了一些工具后,只能在安装目录下才能运行该工具。 如果想在任意目录都能访问到这个工具,我们可以把该工具的安装目录加入到系统的PATH环境变量中,这样就能在任意目录下访问了。 打开终端,将工具所在的目录添加到你的PATH环境变量中。你需要使用实际路径

    2024年02月10日
    浏览(45)
  • 【Shell 命令集合 系统设置 】⭐⭐⭐Linux 设置环境变量setenv命令 使用指南

    Shell 命令专栏:Linux Shell 命令全解析 setenv命令是用于在Linux系统中设置环境变量的命令。环境变量是一种在操作系统中存储的键值对,用于存储系统配置信息、用户偏好设置以及程序运行所需的路径等信息。通过设置环境变量,可以方便地在不同的程序之间共享数据。 seten

    2024年02月08日
    浏览(55)
  • 【Shell 命令集合 系统设置 】⭐⭐⭐Linux 置环境变量 export命令 使用指南

    Shell 命令专栏:Linux Shell 命令全解析 export命令是Linux中的一个内建命令,用于设置环境变量。环境变量是在操作系统中用于存储各种配置信息的一种机制。通过设置环境变量,可以影响系统的行为和程序的运行。 使用export命令,可以将一个变量从当前shell传递到子shell或其他

    2024年02月05日
    浏览(69)
  • 操作系统:Linux 环境变量配置的 6 种方法

    操作系统:Linux 环境变量配置的 6 种方法 linux查看、添加、删除环境变量 ------------------------------------------------------------   https://blog.csdn.net/mayue_web/article/details/97023615 针对修改的配置文件执行: source ~/.bashrc 当前终端和新连接的终端自动生效。         source ~/.bashrc 针对已

    2024年02月08日
    浏览(38)
  • 【Linux从入门到放弃】Linux操作系统环境变量一文详解

    🧑‍💻作者: @情话0.0 📝专栏:《Linux从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢!   提到环境变量,大家应该都不会陌生,不管学习Java还是Phython都需要去安装环境变量,尤其是我自己在做深度学习

    2024年02月05日
    浏览(51)
  • 如何在 Linux 中将目录添加到 PATH 变量,方便执行自定义命令

    在 Linux 系统中,PATH 变量是一个非常重要的环境变量,用于指定系统在执行命令时搜索可执行文件的路径。默认情况下,系统会在预定义的一组目录中查找可执行文件。但是,有时候我们可能需要将自定义的目录添加到 PATH 变量中,以便系统能够找到我们自己创建的可执行文

    2024年02月07日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包