首页 > 系统相关 >Linux:环境变量

Linux:环境变量

时间:2024-09-28 09:48:18浏览次数:8  
标签:1.4 环境变量 指令 参数 Linux PATH 我们

一、环境变量

1.1 PATH的引入

问题1:为什么我们平时输入的指令可以直接运行,但是自己编译出来的程序却要加 ./?

——>因为指令所需要的相关程序是存储在系统能够查找得到的底下,而我们自己编译出来的程序是在当前的工作目录的,系统并不能直接找到。

问题2:凭什么系统可以找到指令的程序却找不到自己的程序呢??

——> 因为环境变量PATH,他是Linux系统指令搜索路径,用echo  $PATH(需要加)可查看系统能够找到的路径 ,其中路径以 “ :”为分隔符  (比如pwd能直接使用就是因为/usr/bin路径在PATH变量中)

 如果我们用自己编译的程序,就会显示command not found ,意思就是xshell帮我们找过了,只是他找不到而已

 问题3:如果我想让自己写的程序像指令一样去使用,有什么办法呢???

——>(1)思路1:比如/usr/bin路径在PATH变量里,那我们就把自己写的程序放到该路径下即可

(2)思路2:我当前的程序无法使用时因为我的工作目录不在系统的指令搜索路径内,所以我们把当前的工作目录加入到PATH中就行了!!

 问题4:如何修改环境变量

——> (1)PATH=……   但是这样的意思是赋值,也就是说原先的内容会被覆盖掉,这样会导致我们绝大多数指令跑不了(有一部分指令是内建命令,不会被影响)    但是我们只要重新启动xsell就会恢复,因为我们的PATH是一个内存级文件,他是在我们xshell打开之后加载进去的!!

(2)PATH=$PATH:……   这样的意思就是在原有路径的基础上新增路径

1.2 HOME和SHELL 

HOME会在我们xshell登录的时候自动识别用户,然后将根目录载入进去

SHELL 里面的是我们当前的xshell所使用的可执行程序

1.3 查看所有环境变量的方法

1.3.1 命令行形式

env——>查看所有的环境变量

1.3.2 系统调用接口

getenv()

1.3.3 第三方变量获取

extern char **environ

 ​​​​​

1.3.4 如何通过系统调用接口来判断权限

       通过getenv我们可以知道,只要我们将我们想要查找的环境变量放在参数里,就可以以字符串的形式返回 ,   所以我们可以用strcmp()这个字符串比较函数,我们的 USER和root一样,那么就是超级用户,其他情况就是普通用户。

      所以因为有了环境变量,系统就可以知道你是谁,就可以和文件的拥有者、所属组、其他人的权限进行比较,就可以知道你是否具备对应的权限!!    

1.4 命令行参数

1.4.1 选项的两个参数

其实我们的main函数是可以带参数的,因为他其实也是被别人调用的一个函数

int argc:向量表中命令行参数的个数

char* argv[ ]: 其实是一个向量表,里面存储着命令行参数 (最后的位置为nullptr)

我们可以看到向量表的第一个位置一定是这个指令,而后面的位置存放一些附加的选项

        这样做的原因是为指令、工具、软件等提供命令行选项的支持,几乎所有的语言都需要命令行参数,因为这样能够为我们的一些选项定制特殊化的功能

1.4.2 系统调用接口模拟实现定制化选项

        先暂时不考虑多个选项的情况,因为这个会涉及到可变参数的知识 ,所以我们先假设只能携带一个选项,而由于向量表的第一个位置必然是./mycode 因此第二个位置就是我们携带的选项,因为选项是字符串的形式,因此我们就可以通过strcmp函数通过条件编译,来实现不同的选项实现不同的功能!

     所以另一方面我们可以知道,main函数是如何知道自己有多少个参数呢??其实本质上来说就是main函数也是被别人调用的,所以他在调用的时候就会在底层进行相关的条件编译(也就是对你的参数做检查),不同的参数就走不同的方向

1.4.3 环境变量相关的参数

其实还有一个参数  char* env[ ]——>存储环境变量向量表

 因此我们可以知道了两张重要的向量表:(1)命令行参数表 (2)环境变量表

 1.4.4 理解环境变量的全局属性

       环境变量是系统提供的一组name=value形式的变量,不同的环境变量有不同的用户,通常具有全局属性

      如何理解全局属性,其实本质上就是由于环境变量表,我们所执行的进程都是子进程,bash本身在启动的时候,会从操作系统的配置文件中读取环境变量信息,然后子进程会继承父进程的环境变量!! 因此环境变量表会被继承下去!!就相当于是全局了!

      根据前面的知识。如果是先创建了进程,然后再修改了环境变量,那么新创建的子进程必然会被继承下去(共享数据),但如果创建了子进程然后修改了环境变量并不会影响父进程的环境变量,因为会发生写时拷贝

1.4.5 本地变量vs环境变量

本地变量只会在bash内部有效,不会被继承

set ——>查看所有的环境变量的本地变量

export ……——>将本地变量变成环境变量

unset……——>清除环境变量

什么情况下需要本地变量呢??

——>就是只希望在bash里面使用但是不希望被子进程继承下去的,比如说我们的命令行提示符,如果是root用户就是# 如果是普通用户就是$ 

1.4.6 常规命令vs内建命令 

       之前我们提到过,如果我们不小心将环境变量覆盖了,那么就会导致大部分的指令用不了,但是并不是所有的指令都用不了!! 比如echo、pwd、cd…… 因为他们是内建命令

常规命令:通过创建子进程完成的

内建命令:bash不创建子进程,而是由自己亲自执行,类似与bash调用了自己一些的,或者是系统提供的函数 

 所以一般的命令,我们可以知道bash应该是使用了fork函数创建了子进程去完成的,但是内建命令就是直接去完成

1.4.7 模拟实现内建命令cd

chdir

1.5  再次总结环境变量

    环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,通常具有全局属性,并且一般来讲都有其特殊的用途(比如我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。)

环境变量相关命令:

1、echo: 显示某个环境变量值

2. export: 设置一个新的环境变量

3. env: 显示所有环境变量

4. unset: 清除环境变量

5. set: 显示本地定义的shell变量和环境变量

 环境变量的组织方式:每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串      

 

标签:1.4,环境变量,指令,参数,Linux,PATH,我们
From: https://blog.csdn.net/weixin_51142926/article/details/141651668

相关文章

  • 【Linux】进程控制
     ......
  • 在Linux中挂载远程主机目录:详解SSHFS挂载
    在日常的服务器管理过程中,我们经常会遇到这样一种场景:需要将一台远程主机上的某个目录挂载到本地主机上,以便于进行文件共享、远程操作等。对于Linux用户来说,sshfs是一个简单而高效的工具,可以轻松地将远程目录挂载到本地文件系统中。本文将为大家详细讲解如何使用sshfs来实现这一......
  • Linux的4755属性
    一、特殊权限位Linux文件权限中的第一个数字(在本例中为4)表示**特殊权限位**。它控制文件类型的特殊行为,例如:***4**:**setuid(SUID)**位。当文件由非root用户执行时,它允许该用户暂时获得该文件的属主权限。这通常用于允许非特权用户执行需要root权限的任务。***2**:**se......
  • Linux权限
    一、用户权限1、解释器/bin/sh默认/bin/bash默认/sbin/nologin虚拟用户/dashubuntu2、用户配置用户信息配置文件/etc/passwd一行内容tjer:x:1000:1000:tjer:/home/tjer:/bin/bash(用户名密码uidgid注释解释器)密码文件地址/etc/shadow组信息地址/etc......
  • Linux 防火墙与安全管理工具详解
    Linux防火墙与安全管理工具详解1.Iptables概述Iptables是Linux系统中用于控制网络流量的工具,通过定义规则来过滤、转发和修改数据包。其规则可以细致地管理进入和离开系统的数据流。1.1三表五链1.1.1三表Iptables中主要有三种表,每种表用于不同的操作:filter表......
  • Linux服务器磁盘空间占用情况分析与清理指南
    为确保重大节日期间,团队负责的测试环境服务器磁盘不会占用过高,导致频繁报警。我们要求在重大节假日前对服务器磁盘占用情况进行检查。如果发现占用过高,则需人为介入,进行相应清理。一、检查要求查看各分区占用情况,如果达到以下任一条件,则需要人为介入判断或处理:(1)磁盘使用......
  • 一个9年archlinux重度使用者自述
    系统没有高低贵贱,主要还是使用的人,哪个跟你更契合。对我而言,archlinux就是最契合的那个。本文主要是对archlinux使用做一个粗浅的介绍,如果能勾起你一丝兴趣,那就更好了。第一部分:初识ArchLinux从Ubuntu和Fedora到Arch的转变大学期间了解到有linux这么一类系统,看起来很酷,那命......
  • 新手答疑 | 零基础该怎么学习嵌入式?嵌入式Linux学习路线是什么?嵌入式开发板推荐?
    很多初学者想要涉足嵌入式Linux开发领域,但往往在刚入门阶段,会因为初次接触到大量复杂的概念术语和深奥的技术文档感到压力重重,面对这些内容不知从何下手,感到十分迷茫,网上的内容也纷繁复杂,没有清晰的学习线路,看完后甚至更蒙圈。实际上,嵌入式Linux开发并没有想象中的那样高不可攀,关键......
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版在线打开 word文件并提取数据区
    PageOffice国产版:支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)、龙芯(LoogArch)芯片架构。查看本示例演示效果本示例关键代码的编写位置Vue+Springboot注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如......
  • Linux学习完真的能找到工作吗?
    Linux作为一种开源的操作系统,在企业和机构中得到了广泛的应用,因此需要大量的Linux专业人才。而Linux知识体系比较广泛,想要从事相关工作需要具备专业的技能,因此为了满足用人标准,不少小伙伴会选择参加培训,那么Linux培训完能找到工作吗?以下是具体内容介绍。Linux培训完能找到......