Linux:命令行参数、环境变量
命令行参数
执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是当我们想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。
在 C 语言中,命令行参数是一种从命令行获取输入的方法,可以用于运行程序时传递信息给程序。命令行参数通过 main 函数的参数传递给程序。main 函数的原型可以是如下两种形式之一:
int main(int argc, char *argv[]);
或者:
int main(int argc, char **argv);
argc
(argument count): 表示命令行参数的数量,包括程序名本身。因此,argc
至少为1
argv
(argument vector): 是一个指向字符串数组的指针,其中每个字符串是一个命令行参数。数组的第一个元素(即 argv[0]
)通常是程序的名称。接下来的元素是传递给程序的命令行参数。
环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,是操作系统为了满足不同的应用场景预先在系统内预先设置的一大批全局变量。
按生命周期分:
永久的:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。
临时的:用户利用export命令,在当前终端下声明环境变量,关闭Shell终端失效。
按作用域分:
系统环境变量:公共的,对全部的用户都生效。
用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。
Linux 环境变量分类
系统级环境变量:
系统级环境变量对所有用户和进程都可见。它们通常在系统启动时被设置,并被所有用户和进程共享。一些常见的系统级环境变量包括PATH(用于指定可执行文件的搜索路径)、LANG(用于设置系统语言环境)等。
用户级环境变量:
用户级环境变量是每个用户独立设置的,只对该用户及其相关进程可见。这些变量可以在登录时通过不同的配置文件(如.bashrc、.bash_profile、.profile等)设置。常见的用户级环境变量包括HOME(指定用户的主目录路径)、USER(当前用户名)等。
进程级环境变量:
进程级环境变量是由特定进程设置的,并且仅对该进程及其子进程可见。这些变量可以通过编程语言(如C语言中的setenv函数)在程序中进行设置,或者通过终端命令行在特定的进程上下文中设置。
常⻅环境变量
PATH:决定了系统在哪些目录中查找可执行文件。当你输入一个命令时,系统会在PATH中定义的目录中查找该命令的可执行文件。
HOME:指定当前用户的主目录路径。
USER:当前用户的用户名。
SHELL:指定当前用户默认使用的shell。
LANG:指定系统的默认语言。
LD_LIBRARY_PATH:指定系统在哪些目录中查找共享库文件。
TERM:指定当前终端的类型。
PS1:定义命令行提示符的格式。
PS2:定义多行命令的提示符的格式。
查看环境变量⽅法
查看某一环境变量
echo $NAME //NAME:你的环境变量名称
查看所有的环境变量:
env
改变环境变量
设置新的环境变量,也可以用于修改已有的环境变量:
export NAME=//NAME为环境变量名
也可以在原有的环境变量上追加:
export PATH=$PATH:/home/nexus/process
进程是如何获取环境变量的
当我们打开终端界面时,会生成bash进程,bash进程有两个表:环境参数表和命令行参数表(都是类型为char*的指针数组),bash进程在启动时会读取操作系统本身的配置文件,并填写环境变量表,每当有子进程被创建时,父进程就将它的环境变量表传给子进程
当我们尝试通过指令或者程序操作等方法修改环境变量后,结束bash进程,并重新启动bash进程后会发现:环境变量会恢复为原先的配置。
这是因为每次启动bash进程都会读取系统的配置文件来获取环境变量,如果希望保持自定义的环境变量就需要修改配置文件,这样在每次bash
启动后都会按照自定义配置文件进行初始化。
通过修改配置文件进行永久修改:
~/.bash_profile 和 ~/.bashrc:用户级环境变量配置文件。
/etc/profile 和 /etc/bashrc:全局环境变量配置文件。
修改配置文件后,需使用以下命令使其生效:
source ~/.bashrc
获取环境变量
使用命令行第三个参数
在C语言中,**<font style="color:rgb(6, 6, 7);">main</font>**
函数可以接受三个参数,
通常定义为**<font style="color:rgb(6, 6, 7);">int main(int argc, char *argv[], char *env[])</font>**
。
*env[]
实际就是环境表,是在操作系统调用main
的时候传递给程序的,作为一个全局变量存储在main
栈帧中。可以通过main
函数的第三个参数env
访问环境变量表:
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{for (int i = 0; env[i]; i++) {printf("%s\n", env[i]);}return 0;
}
使用全局变量environ
在libc
中定义了一个全局变量environ
,它指向环境变量表:
#include <stdio.h>
extern char **environ; // 声明
int main()
{for (int i = 0; environ[i]; i++) {printf("%s\n", environ[i]);}return 0;
}
需要注意的是,environ
未包含在任何头文件中,因此需要手动声明。
使用库函数getenv
getenv函数可以获取指定的环境变量值:
#include <stdio.h>
#include <stdlib.h>
int main()
{printf("%s\n", getenv("PATH"));return 0;
}