跳到主要内容 Linux 命令行参数与环境变量深度解析及配置实践 | 极客日志
C
Linux 命令行参数与环境变量深度解析及配置实践 本文深入解析 Linux 系统中的命令行参数与环境变量机制。涵盖命令行参数的原理、选项功能实现,以及环境变量的概念、常见变量(PATH、HOME)、查看与设置方法(env、export、unset)。详细讲解通过 C 语言代码获取环境变量(getenv、environ),环境变量继承性,以及配置文件(.bashrc、.bash_profile)的修改实验。最后列举系统常用环境变量详解及内建命令,提供 Makefile 与 C 代码示例辅助理解。
Linux 命令行参数与环境变量深度解析
本文预告
本文主要围绕【命令行参数和环境变量】展开,重点在于以下四点:
命令行参数的原理与选项功能。
环境变量的概念、查看与设置方法。
通过代码获取环境变量及继承机制。
配置文件修改实验与常见环境变量详解。
环境变量和命令行参数
4.1 命令行参数
4.1.1 命令行参数的原理 main 函数通常不带参数,但解析命令行参数通常是 bash 进程来做的——程序替换。
4.1.2 命令行参数可以实现选项功能 以关机程序(shutdown)为例。选项功能通过命令行参数实现。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
char input[20 ] = {0 };
system("shutdown -s -t 60" );
while (1 ) {
printf ("你的电脑将在一分钟后关机,输入:取消,可以终止\n" );
scanf ("%s" , input);
if (strcmp (input, "取消" ) == 0 ) {
system("shutdown -a" );
printf ("关机程序已关闭\n" );
break ;
}
}
return 0 ;
}
-s:关闭计算机。
-t xxx:设定多久之后关机(秒数),默认是 30 秒。
4.1.3 补充:命令行参数名可以自定义 形参名称可以自定义(如 argc, argv),但为了规范建议使用约定俗成的名字。
4.2 环境变量
4.2.1 概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。例如在链接动态静态库时,编译器通过环境变量查找路径。
4.2.2 常见的环境变量 包括 PATH, HOME, PWD, SHELL 等。
4.2.3 查看环境变量的方法
4.2.3.1 测试 PATH
创建 hello.c 文件并编译。
对比 ./hello 执行和直接 hello 执行。
将程序所在路径加入环境变量 PATH:export PATH=$PATH:/path/to/program。
再次测试是否可以直接运行。
4.2.3.2 测试 HOME
用 root 和普通用户分别执行 echo $HOME,对比差异。
执行 cd ~; pwd,对应 ~ 和 HOME 的关系。
4.2.4 和环境变量相关的指令
echo:显示某个环境变量值。
export:设置一个新的环境变量。
env:显示所有环境变量。
unset:清除环境变量。
set:显示本地定义的 shell 变量和环境变量。
4.2.5 环境变量的组织方式 每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以 \0 结尾的环境字符串。
4.2.6 通过代码如何获取环境变量
4.2.6.1 命令行第三个参数 #include <stdio.h>
int main (int argc, char * argv[], char * env[]) {
int i = 0 ;
for (; env[i]; i++) {
printf ("%s\n" , env[i]);
}
return 0 ;
}
4.2.6.2 通过第三方变量 environ 获取 #include <stdio.h>
int main (int argc, char * argv[]) {
extern char ** environ;
int i = 0 ;
for (; environ[i]; i++) {
printf ("environ[%d]: %s\n" , i, environ[i]);
}
return 0 ;
}
libc 中定义的全局变量 environ 指向环境变量表,使用时需用 extern 声明。
4.2.7 通过系统调用获取或设置环境变量 #include <stdio.h>
#include <stdlib.h>
int main () {
printf ("%s\n" , getenv("PATH" ));
return 0 ;
}
4.2.8 环境变量通常是具有全局属性的 #include <stdio.h>
#include <stdlib.h>
int main () {
char * env = getenv("MYENV" );
if (env) {
printf ("%s\n" , env);
} else {
printf ("Environment variable not found\n" );
}
return 0 ;
}
若未导出(如 export MYENV="hello world"),子进程无法获取。
4.2.9 实验:本地变量与导出 如果只进行 MYENV="helloworld" 而不调用 export,子进程无法读取该变量,因为它只是 Shell 的本地变量。
4.2.10 环境变量的实际场景 在 Windows 操作系统中将 VS 添加到 PATH 环境变量中,以便在命令行直接调用相关工具。
4.2.11 引入 Linux 环境变量
4.2.11.1 PATH echo $PATH 获取环境变量内容。注意 $PATH 前需加 $,否则会被当成字符串。
4.2.11.2 让 myproc 执行不用带路径
做法一 :将可执行程序拷贝到系统指明的路径底下(如 /usr/bin)。
做法二 :把当前路径添加到环境变量里面。
错误做法:覆盖 PATH(会导致大部分命令失效)。
正确做法:追加路径 export PATH=$PATH:./current_dir。
4.2.11.3 HOME
4.2.11.4 PWD
4.2.11.5 指令为何可以不带路径 像 pwd, ls, make 等程序可以执行是因为系统会在环境变量 PATH 记录的搜索路径下找到它们。
4.2.11.6 which 命令 which 用于搜索环境变量 PATH 中是否存在某命令。
4.2.11.7 结论 命令行中修改环境变量是内存级修改,退出重启后恢复(根据系统特定的配置文件重新生成)。
4.2.12 获取、设置环境变量 通过 C 代码遍历 argv 和 env 数组,或使用 getenv 获取特定变量。
4.2.13 理解环境变量的产生,修改文件配置实验
4.2.13.1 env:查看环境变量
4.2.13.2 结论 任何进程启动都会存在两张表:命令行参数表和变量表。
4.2.13.3 环境变量具有全局属性 本质是环境变量被子进程继承了。环境变量表是内存级的,来源于系统的配置文件。
4.2.13.4 配置文件:bashrc 和 bash_profile
~/.bashrc :掩码 umask、bash 都在开机启动时配置好了。设置 PATH 等。
~/.bash_profile :登录时加载的配置。
Windows 配置文件 :类似 Linux 中的配置文件操作。
4.2.13.5 export:把本地变量变成环境变量 export 将本地变量提升为环境变量,使其对子进程可见。
4.2.13.6 本地变量
4.3 查看并详解系统中所有的环境变量
HOME : 当前用户的家目录。
HOSTNAME : 当前机器的主机名。
TERM : 登录终端类型。
SHELL : 登陆后采用的 shell。
USER : 登录用户。
LD_LIBRARY_PATH : 动态库搜索路径。
LS_COLORS : ls 命令配色方案。
PATH : 搜索可执行程序的路径。
PWD : 当前工作路径。
LANG : 语言和编码格式。
LOGNAME : 真实登录用户。
OLDPWD : 上一次的工作路径。
4.4 内建命令 Shell 语法中属于内置命令的部分(如 . 命令)。
本文文章代码演示
Makefile myproc: myproc.c
gcc -o $@ $^ -std=c99
.PHONY : clean
clean:
rm -f myproc
myproc.c #include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char * argv[], char * env[]) {
(void )argc;
int i = 0 ;
for (; argv[i]; i++) {
printf ("argv[%d]: %s\n" , i, argv[i]);
}
printf ("----------------------------------\n" );
for (i = 0 ; env[i]; i++) {
printf ("env[%d]: %s\n" , i, env[i]);
}
return 0 ;
}
结尾 本文涵盖了命令行参数与环境变量的核心概念、操作命令及代码实现,希望对学习 Linux 相关内容有所帮助。
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
JSON美化和格式化 将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online