文章目录
- 问题引入
- 环境变量
- 环境变量相关操纵(附源码)
- 命令行参数
- 问题解释
问题引入
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)是两种不同类型的变量,它们具有不同的作用范围和生命周期。
-
作用范围:
- 本地变量:本地变量只在定义它的代码块(如函数或脚本)内部有效。它们对于其他代码块是不可见的。
- 环境变量:环境变量在整个系统中都是可见的,可以被不同的进程和程序访问和使用。
-
生命周期:
- 本地变量:本地变量的生命周期与它们所在的代码块相关。当代码块执行完毕或变量超出作用范围时,本地变量将被销毁。
- 环境变量:环境变量的生命周期在整个系统中持久存在,直到显式删除或系统关闭。它们可以在不同的进程和会话中共享和传递值。
-
设置和访问:
- 本地变量:本地变量通常是通过在代码中直接声明和赋值来设置的,并且只能在定义它们的代码块中使用。
- 环境变量:环境变量可以在shell中使用
export
命令设置,或者通过在启动脚本(如.bashrc
或.profile
)中定义。其他进程和程序可以通过调用系统函数(如getenv()
)来访问环境变量的值。
-
用途:
- 本地变量:本地变量通常用于在代码块内部存储临时数据和中间结果,对于其他代码块是不可见的。
- 环境变量:环境变量用于存储系统级的配置信息、用户首选项、路径等,可以在不同的进程和会话中共享和使用。
总之,本地变量和环境变量在作用范围、生命周期、设置和访问方式以及用途上有所区别。本地变量仅在定义它们的代码块内部有效,用于存储临时数据;而环境变量在整个系统中可见,用于存储系统级配置信息。
env指令
在Linux中,env
是一个命令行工具,用于显示当前进程的环境变量或在指定环境下执行给定命令。
env
命令的常见用法有两种:
-
显示当前进程的环境变量:
$ env
这会列出当前进程的所有环境变量及其对应的值。输出的格式为
key=value
形式。 -
在指定环境下执行给定命令:
$ 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系统即可,永久更改需在配置文件中操作,但不建议这样做)