【Linux系统】命令行参数和环境变量

📅 发布时间:2026/7/16 18:18:52 👁️ 浏览次数:
【Linux系统】命令行参数和环境变量
1. 环境变量基本概念定义环境变量Environment Variables是操作系统中用于指定系统运行环境参数的变量通常以键值对变量名内容形式存在。它们为程序提供运行所需的配置信息如文件路径、系统行为设置等 。示例在C/C编译时链接器通过环境变量如LIBRARY_PATH自动定位动态/静态库的位置无需手动指定路径即可成功生成可执行程序 。2. 命令行参数在环境变量展开介绍前我们先来认识一下命令行参数那命令行参数又是什么呢命令行参数则是用户在启动程序时传递给程序的参数这些参数在程序运行时可用。它们通常是特定于程序的用于指定程序运行时的一些选项或参数。例如我们常写的main函数他其实是可以有参数的代码语言javascriptAI代码解释int main(int argc, char *argv[]) { // ... }int argc参数个数包括程序名。char *argv[]参数值数组argv[0]是程序名后续元素是用户传递的参数。argv是一个以NULL结尾的指针数组结构如下代码语言javascriptAI代码解释char *argv[] { ./a.out, arg1, arg2, NULL }; // 示例argv[0]程序名称如./a.out。argv[1..argc-1]用户输入的参数。argv[argc] NULL标识参数数组结束 。示例代码解释以下是一个简单的示例展示如何使用命令行参数代码语言javascriptAI代码解释#include stdio.h int main(int argc, char *argv[]) { for (int i 0; i argc; i) { printf(argv[%d]: %s\n, i, argv[i]); } return 0; }代码解析argc是命令行参数的个数。argv是一个指向字符数组的指针数组每个元素对应一个命令行参数。通过循环遍历argv数组可以打印出所有的命令行参数。运行示例假设将上述代码保存为 code.c编译并运行代码语言javascriptAI代码解释ltxhcss-ecs-d90d:~/lesson4$ ls -l total 8 -rw-rw-r-- 1 ltx ltx 766 Jul 15 15:18 code.c -rw-rw-r-- 1 ltx ltx 58 Jul 15 15:21 Makefile ltxhcss-ecs-d90d:~/lesson4$ make gcc -o code code.c ltxhcss-ecs-d90d:~/lesson4$ ./code argv[0]: ./code ltxhcss-ecs-d90d:~/lesson4$ ./code a argv[0]: ./code argv[1]: a ltxhcss-ecs-d90d:~/lesson4$ ./code a b argv[0]: ./code argv[1]: a argv[2]: b ltxhcss-ecs-d90d:~/lesson4$ ./code a b c argv[0]: ./code argv[1]: a argv[2]: b argv[3]: c ltxhcss-ecs-d90d:~/lesson4$ ./code a b c d argv[0]: ./code argv[1]: a argv[2]: b argv[3]: c argv[4]: d执行make命令根据Makefile中的规则编译代码。这里调用了gcc编译器将code.c文件编译成一个可执行文件code。从运行结果可以看出程序正确地接收并输出了命令行参数。argv[0]始终是程序本身的名称后面的argv[1]到argv[n]依次是提供的命令行参数。参数的个数由argc表示在每次运行中argc的值等于输出的argv索引最大值加1。其实我们的进程在启动时默认就有一个命令行参数表传递机制父进程如Shell通过exec()系统调用将参数表复制到子进程的栈空间子进程的main()函数通过argc参数数量和argv参数表指针访问 。实际应用场景那命令行参数有什么用呢我们再来看一段代码代码语言javascriptAI代码解释#include stdio.h #include string.h // main有参数吗?有 int main(int argc, char *argv[]) { if(argc ! 2) { printf(Usage: %s [-a|-b|-c]\n, argv[0]); return 1; } const char *arg argv[1]; if(strcmp(arg, -a)0) printf(这是功能1\n); else if(strcmp(arg, -b)0) printf(这是功能2\n); else if(strcmp(arg, -c)0) printf(这是功能3\n); else printf(Usage: %s [-a|-b|-c]\n, argv[0]); return 0; }运行结果代码语言javascriptAI代码解释ltxhcss-ecs-d90d:~/lesson4$ make gcc -o code code.c ltxhcss-ecs-d90d:~/lesson4$ ./code Usage: ./code [-a|-b|-c] ltxhcss-ecs-d90d:~/lesson4$ ./code -a 这是功能1 ltxhcss-ecs-d90d:~/lesson4$ ./code -b 这是功能2 ltxhcss-ecs-d90d:~/lesson4$ ./code -c 这是功能3 ltxhcss-ecs-d90d:~/lesson4$ ./code -abc Usage: ./code [-a|-b|-c]错误处理if(argc ! 2)确保用户必须提供一个选项。如果参数数量不符打印用法并退出返回非零值表示错误。选项匹配strcmp比较argv[1]与预定义字符串如-a匹配成功则执行对应功能。这种设计允许程序通过不同选项激活不同子功能体现了“单一程序多种行为”的灵活模式。鲁棒性设计else分支处理无效选项如用户输入-d防止程序崩溃。此代码的核心在于命令行参数作为程序行为的控制开关通过参数值动态决定执行路径。这是Linux系统工具如ls、grep的基础实现原理。main函数命令行参数的功能与原理命令行参数是操作系统与程序间传递配置信息的核心机制尤其在Linux环境中它实现了程序的模块化和可配置性。以下是其功能与原理的详细分析。1.核心功能行为控制允许同一程序通过不同参数执行不同功能如示例中的-a、-b。这是Linux指令如ls -lvsls -a多样性的基础。输入传递向程序传递运行时数据如文件名、数值阈值。例如grep pattern file.txt中pattern和file.txt通过argv传递。错误预防通过argc检查参数数量避免无效输入导致的未定义行为如示例中的if(argc ! 2)。自文档化argv[0]用于打印用法如printf(Usage: %s ..., argv[0])提升用户体验。2.工作原理Shell解析阶段用户输入命令如./program -a后Shell如Bash按空格分割字符串生成argv数组[, -a, NULL]。Shell通过exec()系统调用如execv启动程序并将argv数组复制到进程内存栈中。程序执行阶段操作系统加载程序后自动将argc和argv传递给main函数。程序解析argv如使用strcmp或库函数如getopt执行对应逻辑。内存结构argv和environ环境变量表在进程地址空间中相邻存储均由父进程Shellls是Linux核心命令用于列出目录内容。其选项如-l、-a通过main函数的命令行参数实现本质与我们的示例代码相同。所有Linux命令的选项本质都是通过main的argv实现为什么平时写代码时main函数没有参数简单性大多数简单的程序不需要命令行参数。它们可能从标准输入读取数据或者处理硬编码的文件名等。在这种情况下使用无参数的main函数更为简洁和直接。代码可读性省略不必要的参数可以使代码更清晰减少混乱。如果程序不需要处理命令行参数那么包含argc和argv只会增加不必要的复杂性。默认行为C标准允许main函数的这两种常见形式带参数和不带参数。编译器通常会支持这两种形式所以开发者可以选择最适合自己需求的形式。习惯和惯例在教学和示例代码中通常使用最简单的形式来避免分散学习者的注意力。这可能导致许多人在初学时习惯于使用无参数的main函数。总之是否使用带参数的main函数取决于程序的具体需求。如果程序不需要命令行参数使用无参数的main函数是完全合理且常见的做法。3. 一个例子一个环境变量3.1 示例代码语言javascriptAI代码解释ltxhcss-ecs-d90d:~/lesson4$ ls code code.c Makefile ltxhcss-ecs-d90d:~/lesson4$ pwd /home/ltx/lesson4 ltxhcss-ecs-d90d:~/lesson4$ ./code Usage: ./code [-a|-b|-c]思考为什么我们的代码编译成可执行程序后需要加路径./当前目录下而系统的指令不需要带路径呢我们来试一下如果我们的可执行程序不带路径会怎么样呢代码语言javascriptAI代码解释ltxhcss-ecs-d90d:~/lesson4$ code Command code not found, but can be installed with: snap install code Please ask your administrator.我们发现系统说他找不到这个指令那如果我们在使用系统的指令的时候带上路径会有什么不一样吗代码语言javascriptAI代码解释ltxhcss-ecs-d90d:~/lesson4$ which ls /usr/bin/ls ltxhcss-ecs-d90d:~/lesson4$ /usr/bin/ls code code.c Makefile ltxhcss-ecs-d90d:~/lesson4$ ls code code.c Makefile可以看到系统的指令带不带路径都能找到我们的程序不带路径就找不到这是为什么呢在Linux系统中当你运行一个可执行程序时系统会根据环境变量PATH中定义的目录来查找该程序。而我们的可执行程序code不在PATH中定义的目录里所以在运行时需要指定其相对路径./code。否则系统会在PATH指定的目录中查找找不到就会提示命令未找到。3.2 环境变量PATH环境变量PATH是一个包含多个目录路径的变量用于告诉操作系统在哪些目录中查找可执行文件。例如当你在命令行中输入ls时系统会在PATH指定的目录中依次查找ls命令。运行以下命令可以查看当前的PATH环境变量代码语言javascriptAI代码解释echo $PATH输出示例代码语言javascriptAI代码解释ltxhcss-ecs-d90d:~/lesson4$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin为什么系统命令不需要带路径系统命令通常安装在PATH中定义的目录里如/usr/bin、/bin等。因此当你运行ls时系统会在PATH中的目录查找并找到/usr/bin/ls。为什么我们的程序不带路径就找不到我们的程序code位于当前目录./下而./通常不在PATH环境变量中。因此当你运行code时系统会在PATH指定的目录中查找但找不到所以提示命令未找到。为什么默认不包含当前目录安全风险若PATH包含当前目录.攻击者可在公共目录放置恶意程序如伪造ls用户进入该目录后输入ls可能触发恶意程序 。命名冲突当前目录下的程序名可能与系统指令冲突如自定义test程序覆盖系统test命令。如何让我们的程序不带路径就能运行有以下几种方法方法命令示例优点缺点复制到系统路径sudo cp code /usr/local/bin永久生效所有用户可用需 root 权限污染系统路径修改 PATH 环境变量export PATH$PATH:/home/ltx/lesson4无需权限快速生效仅当前终端会话有效永久生效配置在 \~/.bashrc 添加 export PATH$PATH:/home/ltx/lesson4用户级持久化需重启终端或执行 source \~/.bashrc示例代码语言javascriptAI代码解释ltxhcss-ecs-d90d:~/lesson4$ export PATH$PATH:/home/ltx/lesson4 ltxhcss-ecs-d90d:~/lesson4$ code Usage: code [-a|-b|-c] ltxhcss-ecs-d90d:~/lesson4$ code -a 这是功能1为什么系统命令可以带路径运行系统命令的路径通常在PATH中因此无论是否带路径系统都能找到它们。例如/usr/bin/ls和ls都可以运行因为/usr/bin在PATH中。总结系统通过环境变量PATH来查找命令。我们的程序code不在PATH中因此需要带路径运行。可以通过修改PATH或移动程序到PATH中的目录来让程序不带路径运行。3.3 环境变量的存储机制深度解析环境变量的本质是操作系统与应用程序间的动态配置桥梁其存储设计融合了内存管理、持久化策略和访问效率的平衡。一、存储层级从内存到磁盘的协同架构环境变量的存储分为运行时内存存储和持久化磁盘存储两级通过操作系统内核协同运作。存储层级物理载体数据结构生命周期典型操作运行时存储进程内存空间指针数组char **environ进程存活期间getenv(), setenv()持久化存储磁盘配置文件如.bashrc文本键值对永久生效source \~/.bashrc运行时内存存储机制数据结构以NULL结尾的连续指针数组char *envp[]每个指针指向KEYVALUE格式的字符串。代码语言javascriptAI代码解释// 内存布局示例 char *envp[] { PATH/usr/bin, HOME/home/ltx, NULL // 结束标记 };存储位置位于进程用户空间栈的顶部通过task_struct-mm-env_start定位Linux内核。访问效率O(n) 遍历复杂度但通过哈希表缓存如Bash的全局环境变量表优化高频访问。持久化磁盘存储机制存储形式纯文本键值对如export PATH$PATH:/new/path。加载过程嵌入式系统特例U-Boot将环境变量存储在独立Flash扇区包含CRC校验头和标志位代码语言javascriptAI代码解释struct env_data { uint32_t crc; // 校验码 uint8_t flags; // 状态标志 char data[4096]; // 键值对数据 };二、数据结构键值对的组织与优化策略基本结构键值编码KEYVALUE格式禁止空格如PATH/usr/bin:/local/bin。内存布局连续字符串数组通过extern char **environ全局变量访问。性能优化技术Copy-on-Write子进程继承父进程环境变量表时共享内存页修改时复制新页。哈希索引Shell维护哈希表如Bash的env_hash将O(n)查找降至O(1)。字符串池化重复值复用同一内存地址如多进程共享PATH值。三、进程继承环境变量的传递与隔离继承机制fork()时复制子进程获得父进程环境变量表的只读副本通过指针共享原始数据。exec()时重建新程序加载时内核将环境变量表指针压入新进程栈顶初始化environ。作用域隔离代码语言javascriptAI代码解释setenv(TEMPVAR, 123); // 修改当前进程环境 pid_t pid fork(); if (pid 0) { // 子进程 TEMPVAR 仍为原值 setenv(TEMPVAR, 456); // 仅修改子进程副本 }4. 常见环境变量以下是一些常见环境变量的详解1. PATH作用指定系统查找可执行文件的路径。示例/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin说明当在终端输入命令时系统会在这些路径下查找对应的可执行文件。2. HOME作用指示当前用户的主目录。示例/home/username说明用户的主目录通常用于存储个人文件和配置文件。3. SHELL作用指定当前用户使用的 shell 类型。示例/bin/bash说明表明用户使用的是哪种 shell如 Bash、Zsh 等。4. USER作用当前登录的用户名。示例username说明用于标识当前用户。5. LOGNAME作用当前登录的用户名。示例username说明与 USER 类似通常用于记录登录名称。6. PWD作用当前工作目录。示例/home/username/documents说明显示用户当前所在的目录。7. oldPWD作用上一次工作目录。示例/home/username/downloads说明用于记录用户之前所在的目录方便用户返回。8. LANG作用指定系统的语言和区域设置。示例zh_CN.UTF-8说明影响系统显示的语言和字符编码。9. TZ作用设置时区。示例Asia/Shanghai说明影响系统显示的时间。10. DISPLAY作用指定显示图形界面的显示器。示例:0说明用于 X Window 系统标识图形界面显示的设备。11. EDITOR作用指定默认的文本编辑器。示例vim、nano说明用于在命令行中编辑文件。12. PAGER作用指定默认的分页程序。示例less、more说明用于分页显示文件内容。13. LD_LIBRARY_PATH作用指定动态链接库的搜索路径。示例/usr/local/lib:/opt/myapp/lib说明系统会在这些路径下查找所需的动态链接库。14. CLASSPATH作用指定 Java 类文件的搜索路径。示例/.:/usr/lib/java:.说明用于 Java 开发指定 Java 虚拟机查找类文件的路径。15. HISTFILE作用指定命令历史记录文件的位置。示例~/.bash_history说明用于记录用户在 shell 中执行过的命令。16. HISTSIZE作用设置命令历史记录的大小。示例1000说明定义可以保存的命令历史记录的数量。17. MAIL作用指定用户的邮件文件位置。示例/var/mail/username说明用于通知用户有新邮件。18. TERM作用指定终端类型。示例xterm、linux说明影响终端模拟器的行为和显示效果。19. SSH_AGENT_PID作用指定 ssh-agent 进程的 PID。示例1234说明用于 SSH 密钥管理。20. SSH_AUTH_SOCK作用指定 ssh-agent 的套接字文件位置。示例/tmp/ssh-abc123/agent.1234说明用于 SSH 密钥认证。21. VIRTUAL_ENV作用指定当前激活的 Python 虚拟环境路径。示例/home/username/envs/myenv说明用于 Python 开发隔离项目依赖。22. XDG_CONFIG_HOME作用指定用户配置文件的目录。示例~/.config说明用于存储应用程序的配置文件。23. XDG_DATA_HOME作用指定用户数据文件的目录。示例~/.local/share说明用于存储应用程序的数据文件。24. XDG_CACHE_HOME作用指定用户缓存文件的目录。示例~/.cache说明用于存储应用程序的缓存文件。25. XDG_RUNTIME_DIR作用指定用户运行时文件的目录。示例/run/user/1000说明用于存储用户运行时的临时文件。26. XDG_DESKTOP_DIR作用指定用户的桌面目录。示例~/.desktop说明用于存储桌面文件和快捷方式。27. XDG_DOCUMENTS_DIR作用指定用户的文档目录。示例~/documents说明用于存储用户的文档文件。28. XDG_DOWNLOAD_DIR作用指定用户的下载目录。示例~/downloads说明用于存储下载的文件。29. XDG_MUSIC_DIR作用指定用户的音乐目录。示例~/music说明用于存储音乐文件。30. XDG_PICTURES_DIR作用指定用户的图片目录。示例~/pictures说明用于存储图片文件。31. XDG_VIDEOS_DIR作用指定用户的视频目录。示例~/videos说明用于存储视频文件。总结环境变量在操作系统和应用程序中起着重要的作用。它们帮助配置运行时环境指定资源位置并影响程序的行为。了解这些常见环境变量的用途可以帮助用户更好地管理和使用系统资源提高工作效率。5. 环境变量操作命令echo 命令用途显示某个环境变量的值。示例echo $PATH。这个命令会输出当前系统中环境变量PATH的值它包含了系统查找可执行文件的多个目录路径这些路径之间用冒号分隔。export 命令用途设置一个新的环境变量或修改现有环境变量的值并将其导出到 shell 环境中使其对当前 shell 会话及其子进程可见。示例export MY_VARmy_value。这会创建一个新的环境变量MY_VAR并将其值设置为my_value。如果该变量已经存在这个命令会修改其值。env 命令用途显示所有当前环境变量。示例直接在终端输入env然后回车系统会列出当前 shell 环境中所有的环境变量及其对应的值包括系统默认的环境变量和用户自定义的环境变量。unset 命令用途清除环境变量使其不再存在于当前 shell 环境中。示例unset MY_VAR。这个命令会清除之前设置的MY_VAR环境变量之后在当前 shell 会话中再使用echo $MY_VAR就不会输出该变量的值了。set 命令用途显示本地定义的 shell 变量和环境变量。示例在终端输入set它会列出当前 shell 环境中所有的变量包括环境变量和 shell 的局部变量。这些变量可能包括用户定义的变量、shell 内置变量以及环境变量等。示例代码语言javascriptAI代码解释ltxhcss-ecs-d90d:~/lesson4$ echo $PATH #输出环境变量PATH的值 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin ltxhcss-ecs-d90d:~/lesson4$ export MY_VARmy_value #设置一个新的环境变量 ltxhcss-ecs-d90d:~/lesson4$ env #显示所有当前环境变量 SHELL/bin/bash HISTSIZE1000 HISTTIMEFORMAT%F %T ltx PWD/home/ltx/lesson4 LOGNAMEltx XDG_SESSION_TYPEtty MOTD_SHOWNpam HOME/home/ltx LANGen_US.UTF-8 MY_VARmy_value #我们刚才设置的 LS_COLORSrs0:di01;34:ln01;36:mh00:pi40;33:so01;35:do01;35:bd40;33;01:cd40;33;01:or40;31;01:mi00:su37;41:sg30;43:ca30;41:tw30;42:ow34;42:st37;44:ex01;32:*.tar01;31:*.tgz01;31:*.arc01;31:*.arj01;31:*.taz01;31:*.lha01;31:*.lz401;31:*.lzh01;31:*.lzma01;31:*.tlz01;31:*.txz01;31:*.tzo01;31:*.t7z01;31:*.zip01;31:*.z01;31:*.dz01;31:*.gz01;31:*.lrz01;31:*.lz01;31:*.lzo01;31:*.xz01;31:*.zst01;31:*.tzst01;31:*.bz201;31:*.bz01;31:*.tbz01;31:*.tbz201;31:*.tz01;31:*.deb01;31:*.rpm01;31:*.jar01;31:*.war01;31:*.ear01;31:*.sar01;31:*.rar01;31:*.alz01;31:*.ace01;31:*.zoo01;31:*.cpio01;31:*.7z01;31:*.rz01;31:*.cab01;31:*.wim01;31:*.swm01;31:*.dwm01;31:*.esd01;31:*.jpg01;35:*.jpeg01;35:*.mjpg01;35:*.mjpeg01;35:*.gif01;35:*.bmp01;35:*.pbm01;35:*.pgm01;35:*.ppm01;35:*.tga01;35:*.xbm01;35:*.xpm01;35:*.tif01;35:*.tiff01;35:*.png01;35:*.svg01;35:*.svgz01;35:*.mng01;35:*.pcx01;35:*.mov01;35:*.mpg01;35:*.mpeg01;35:*.m2v01;35:*.mkv01;35:*.webm01;35:*.webp01;35:*.ogm01;35:*.mp401;35:*.m4v01;35:*.mp4v01;35:*.vob01;35:*.qt01;35:*.nuv01;35:*.wmv01;35:*.asf01;35:*.rm01;35:*.rmvb01;35:*.flc01;35:*.avi01;35:*.fli01;35:*.flv01;35:*.gl01;35:*.dl01;35:*.xcf01;35:*.xwd01;35:*.yuv01;35:*.cgm01;35:*.emf01;35:*.ogv01;35:*.ogx01;35:*.aac00;36:*.au00;36:*.flac00;36:*.m4a00;36:*.mid00;36:*.midi00;36:*.mka00;36:*.mp300;36:*.mpc00;36:*.ogg00;36:*.ra00;36:*.wav00;36:*.oga00;36:*.opus00;36:*.spx00;36:*.xspf00;36: SSH_CONNECTION59.62.147.11 3278 192.168.0.214 22 LESSCLOSE/usr/bin/lesspipe %s %s XDG_SESSION_CLASSuser TERMxterm LESSOPEN| /usr/bin/lesspipe %s USERltx DISPLAYlocalhost:10.0 SHLVL1 XDG_SESSION_ID343 XDG_RUNTIME_DIR/run/user/1000 SSH_CLIENT59.62.147.11 3278 22 XDG_DATA_DIRS/usr/local/share:/usr/share:/var/lib/snapd/desktop PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin DBUS_SESSION_BUS_ADDRESSunix:path/run/user/1000/bus SSH_TTY/dev/pts/0 OLDPWD/home/ltx _/usr/bin/env ltxhcss-ecs-d90d:~/lesson4$ unset MY_VAR #清除之前设置的 MY_VAR 环境变量 ltxhcss-ecs-d90d:~/lesson4$ env #再次显示所有当前环境变量发现刚才设置的MY_VAR环境变量清除了 SHELL/bin/bash HISTSIZE1000 HISTTIMEFORMAT%F %T ltx PWD/home/ltx/lesson4 LOGNAMEltx XDG_SESSION_TYPEtty MOTD_SHOWNpam HOME/home/ltx LANGen_US.UTF-8 LS_COLORSrs0:di01;34:ln01;36:mh00:pi40;33:so01;35:do01;35:bd40;33;01:cd40;33;01:or40;31;01:mi00:su37;41:sg30;43:ca30;41:tw30;42:ow34;42:st37;44:ex01;32:*.tar01;31:*.tgz01;31:*.arc01;31:*.arj01;31:*.taz01;31:*.lha01;31:*.lz401;31:*.lzh01;31:*.lzma01;31:*.tlz01;31:*.txz01;31:*.tzo01;31:*.t7z01;31:*.zip01;31:*.z01;31:*.dz01;31:*.gz01;31:*.lrz01;31:*.lz01;31:*.lzo01;31:*.xz01;31:*.zst01;31:*.tzst01;31:*.bz201;31:*.bz01;31:*.tbz01;31:*.tbz201;31:*.tz01;31:*.deb01;31:*.rpm01;31:*.jar01;31:*.war01;31:*.ear01;31:*.sar01;31:*.rar01;31:*.alz01;31:*.ace01;31:*.zoo01;31:*.cpio01;31:*.7z01;31:*.rz01;31:*.cab01;31:*.wim01;31:*.swm01;31:*.dwm01;31:*.esd01;31:*.jpg01;35:*.jpeg01;35:*.mjpg01;35:*.mjpeg01;35:*.gif01;35:*.bmp01;35:*.pbm01;35:*.pgm01;35:*.ppm01;35:*.tga01;35:*.xbm01;35:*.xpm01;35:*.tif01;35:*.tiff01;35:*.png01;35:*.svg01;35:*.svgz01;35:*.mng01;35:*.pcx01;35:*.mov01;35:*.mpg01;35:*.mpeg01;35:*.m2v01;35:*.mkv01;35:*.webm01;35:*.webp01;35:*.ogm01;35:*.mp401;35:*.m4v01;35:*.mp4v01;35:*.vob01;35:*.qt01;35:*.nuv01;35:*.wmv01;35:*.asf01;35:*.rm01;35:*.rmvb01;35:*.flc01;35:*.avi01;35:*.fli01;35:*.flv01;35:*.gl01;35:*.dl01;35:*.xcf01;35:*.xwd01;35:*.yuv01;35:*.cgm01;35:*.emf01;35:*.ogv01;35:*.ogx01;35:*.aac00;36:*.au00;36:*.flac00;36:*.m4a00;36:*.mid00;36:*.midi00;36:*.mka00;36:*.mp300;36:*.mpc00;36:*.ogg00;36:*.ra00;36:*.wav00;36:*.oga00;36:*.opus00;36:*.spx00;36:*.xspf00;36: SSH_CONNECTION59.62.147.11 3278 192.168.0.214 22 LESSCLOSE/usr/bin/lesspipe %s %s XDG_SESSION_CLASSuser TERMxterm LESSOPEN| /usr/bin/lesspipe %s USERltx DISPLAYlocalhost:10.0 SHLVL1 XDG_SESSION_ID343 XDG_RUNTIME_DIR/run/user/1000 SSH_CLIENT59.62.147.11 3278 22 XDG_DATA_DIRS/usr/local/share:/usr/share:/var/lib/snapd/desktop PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin DBUS_SESSION_BUS_ADDRESSunix:path/run/user/1000/bus SSH_TTY/dev/pts/0 OLDPWD/home/ltx _/usr/bin/env6. 环境变量的组织方式一、数据结构键值对与内存布局核心数据结构环境变量通过KEYVALUE格式的字符串数组组织以NULL指针作为结束标志代码语言javascriptAI代码解释// C语言中环境表的存储结构 char *envp[] { HOME/home/ltx, PATH/usr/bin:/bin, LANGen_US.UTF-8, NULL // 结束标识 };内存布局特点连续内存块存储字符串指针每个指针指向KEYVALUE格式的独立字符串数组末尾以NULL指针标识边界系统级实现差异系统实现方式访问接口Linuxchar **environ全局变量extern char**environWindows_environ(CRT库)_getenv()嵌入式系统独立Flash扇区(带CRC校验)U-Boot的env save命令.