Linux 环境变量 命令行参数

问题引入

Linux下,为什么我们自己写的可执行文件需要写明路径才可以执行,而系统的命令不需要?

如何使自己的命令也可以不带路径执行?

环境变量

Linux环境变量的概念:
Linux环境变量是一种存储在操作系统中的值,用于控制应用程序的行为。环境变量可以在系统启动时设置,也可以在运行时动态设置。环境变量通常用于存储系统级别的配置信息,例如路径、语言、用户名等。在Linux系统中,环境变量以键值对的形式存在,键是变量的名称,值是变量的内容。可以使用命令行工具如export和set来设置和查看环境变量。应用程序可以通过读取环境变量来获取配置信息,从而实现不同的行为。

简易理解
类似于语言学习中的变量 int a = 1 ;a为变量,
1为变量目前所存储的值,在操作系统的学习中,有多种变量,变量的性质不同,功能也不同,变量处处都有,环境变量顾名思义是与程序执行的环境有关,问题引入部分的问题就涉及环境变量的问题。

常见/需要了解的环境变量:
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。

环境变量相关操纵(附源码)

查看环境变量的方法:
方法一、二、三:
在这里插入图片描述
运行结果:在这里插入图片描述

方法四:echo $NAME //NAME:你的环境变量名称。

本地变量与环境变量
在Linux中,本地变量(local variable)和环境变量(environment variable)是两种不同类型的变量,它们具有不同的作用范围和生命周期。

  1. 作用范围:

    • 本地变量:本地变量只在定义它的代码块(如函数或脚本)内部有效。它们对于其他代码块是不可见的。
    • 环境变量:环境变量在整个系统中都是可见的,可以被不同的进程和程序访问和使用。
  2. 生命周期:

    • 本地变量:本地变量的生命周期与它们所在的代码块相关。当代码块执行完毕或变量超出作用范围时,本地变量将被销毁。
    • 环境变量:环境变量的生命周期在整个系统中持久存在,直到显式删除或系统关闭。它们可以在不同的进程和会话中共享和传递值。
  3. 设置和访问:

    • 本地变量:本地变量通常是通过在代码中直接声明和赋值来设置的,并且只能在定义它们的代码块中使用。
    • 环境变量:环境变量可以在shell中使用export命令设置,或者通过在启动脚本(如.bashrc.profile)中定义。其他进程和程序可以通过调用系统函数(如getenv())来访问环境变量的值。
  4. 用途:

    • 本地变量:本地变量通常用于在代码块内部存储临时数据和中间结果,对于其他代码块是不可见的。
    • 环境变量:环境变量用于存储系统级的配置信息、用户首选项、路径等,可以在不同的进程和会话中共享和使用。

总之,本地变量和环境变量在作用范围、生命周期、设置和访问方式以及用途上有所区别。本地变量仅在定义它们的代码块内部有效,用于存储临时数据;而环境变量在整个系统中可见,用于存储系统级配置信息。

env指令
在Linux中,env是一个命令行工具,用于显示当前进程的环境变量或在指定环境下执行给定命令。

env命令的常见用法有两种:

  1. 显示当前进程的环境变量:

    $ env
    

    这会列出当前进程的所有环境变量及其对应的值。输出的格式为key=value形式。

  2. 在指定环境下执行给定命令:

    $ env -i <key1>=<value1> <key2>=<value2> ... <command>
    

    这会在指定的环境变量下执行给定的命令。通过-i选项可以清除当前环境变量,然后通过<key>=<value>的形式设置新的环境变量。最后,<command>表示要执行的命令。

    例如,要在清除环境变量的情况下执行ls命令,可以使用以下命令:

    $ env -i ls
    

    如果要在指定环境变量的情况下执行命令,可以使用以下命令:

    $ env VAR1=value1 VAR2=value2 <command>
    

    例如,要在设置PATH环境变量后执行ls命令,可以使用以下命令:

    $ env PATH=/usr/local/bin ls
    

env命令的主要作用是在不同的环境变量下执行命令,或者查看当前进程的环境变量。它在脚本中常用于控制命令执行的环境,或者作为调试工具来检查环境变量的设置。

可以通过man env命令查看env命令的更多详细信息和选项。
getenv函数
在Linux中,getenv()是一个C语言函数,用于获取指定环境变量的值。

getenv()函数的原型如下:

#include <stdlib.h>

char *getenv(const char *name);

该函数接受一个字符串参数name,表示要获取的环境变量的名称。它返回一个指向环境变量值的字符串的指针,如果找不到指定的环境变量,则返回NULL

以下是一个使用getenv()函数的示例:

#include <stdio.h>
#include <stdlib.h>

int main() {
    
    
    char *path = getenv("PATH");
    if (path != NULL) {
    
    
        printf("PATH: %s\n", path);
    } else {
    
    
        printf("PATH environment variable not found\n");
    }

    return 0;
}

在这个示例中,我们使用getenv()函数获取名为PATH的环境变量的值,并将其存储在path指针变量中。然后,我们根据返回值判断是否成功获取了环境变量,并打印出相应的结果。

需要注意的是,getenv()函数返回的字符串指针指向的是环境变量的内部存储空间,因此不应该尝试修改返回的字符串。如果需要修改环境变量的值,应该使用相关的函数,如setenv()putenv()

另外,getenv()函数是标准C库提供的函数,定义在<stdlib.h>头文件中。在使用getenv()函数之前,需要包含该头文件。

临时环境变量创建(生命周期为本次连接Linux)
export 变量名=变量值
本地变量创建(生命周期为本文件内)
变量名=变量值

命令行参数

在这里插入图片描述
argc的含义为 指针数组argv的所含字符串数。
argv 为接受指令选项的指针数组
env 为接受环境变量的指针数组
argv 和 argc 可规范命令格式,可以支持命令有多选项。
上述3个参数均为 bash 辅助传入(先阶段粗略了解)

问题解释

Linux下,为什么我们自己写的可执行文件需要写明路径才可以执行,而系统的命令不需要?
1.子进程在默认情况下会继承父进程环境变量,始源的环境变量来自于bash,bash的环境变量来自于系统文件;
2.我们执行的命令都是进程中执行;
3.例如 PATH HOME 环境变量几乎在每个进程中都有;
4.系统自带的可执行文件通过PATH环境变量,找到文件位置,不需要传入了。

如何使自己的命令也可以不带路径执行?
1 通过给PATH环境变量添加我们自定义文件的路径
2.PATH变量存储多个系统程序自带的路径,多个路径间用“ :“符号隔开,要想添加,需按此格式。
在这里插入图片描述
3.利用set指令 set PATH = PATH + :所设路径 ;
(指令使用错误也不会造成损失,重新连接Linux系统即可,永久更改需在配置文件中操作,但不建议这样做)

猜你喜欢

转载自blog.csdn.net/WSK1454360679/article/details/131483506