Linux 命令行参数 环境变量
目录
命令行参数
概念
字段
命令行
环境变量
问题:为什么执行系统命令不用带./?
PATH
概念
查看环境变量的方式
env命令编辑
main函数的第三个参数
★C库函数:getenv()
★通过environ指针
全局变量
本地变量
本地变量与环境变量的区别
内建命令
概念
启动时环境变量如何导入
用户级配置文件
系统级别的配置文件
重点
命令行参数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
//for(int i = 0 ; i < argc; i++)//这样也行
// printf("argv[i]=%s\n", argv[i]);
for(int i = 0; argv[i]; i++)
printf("argv[%d]=%s\n", i, argv[i]);
if(argc != 4)
printf("Error\n");
else
{
int num1 = atoi(argv[2]), num2 = atoi(argv[3]);
if(!strcmp(argv[1], "add"))
printf("%d+%d=%d\n",num1, num2, num1 + num2);
if(!strcmp(argv[1], "sub"))
printf("%d-%d=%d\n",num1, num2, num1 - num2);
if(!strcmp(argv[1], "mul"))
printf("%d*%d=%d\n",num1, num2, num1 * num2);
if(!strcmp(argv[1], "div") && num2)
printf("%d/%d=%d\n",num1, num2, num1 / num2);
}
return 0;
}
概念
- 用户在命令行中输入的以空格分割的字符串,就是命令行参数
字段
- argc:表示传递给程序的参数个数
- argv:字符串会存入这个字符指针数组,这个数组以NULL结尾
命令行
- 第一个参数是要执行的程序,所以argv[0]一定不是NULL
- 可以通过不同的选项,让一个程序执行不同的功能
环境变量
问题:为什么执行系统命令不用带./?
- 这是一个结果,就是不用带 "./";
- 其次,执行命令的时候会根据二进制文件,即代码和数据,来创建对应的进程
- 猜测:系统一定会去某些地方找二进制文件
PATH
PATH
是一个环境变量,它定义了操作系统在命令行中搜索可执行文件的目录列表;字符串以冒号隔开- 操作系统会按照
PATH
变量中列出的目录顺序依次查找这个命令对应的可执行文件 - 如果找到了就运行,没有则需输入完整路径或者相对路径
- echo $PATH 可查看 PATH环境变量
- 可以通过这样的方式来修改内存中PATH(内存级修改)
概念
- 环境变量从配置文件中读取
- 这些环境变量仅在当前 shell 实例(当前打开的终端)中存在,因为环境变量是在进程的内存空间中保存的,当进程结束时,这些变量就会消失
- 子进程的命令行参数和环境变量来自父进程
查看环境变量的方式
env命令
main函数的第三个参数
#include <stdio.h>
int main(int argc, char* argv[], char* env[])
{
for(int i = 0; env[i]; i++)
printf("env[%d]:%s\n", i, env[i]);
return 0;
}
- argc和argv写了才能加env这个参数
- 这个代码会有警告,因为argc和argv没有用到
★C库函数:getenv()
- 参数为环境变量名,函数在stdlib.h中
- printf("PATH=%s\n", getenv("PATH"));
★通过environ指针
#include <stdio.h>
int main(int argc, char* argv[], char* env[]) {
extern char **environ;
for (int i = 0; environ[i]; i++)
printf("env[%d]:%s\n", i, environ[i]);
return 0;
}
- 是一个全局变量,意味着它在整个程序的所有源文件中都可以被访问,但前提是你在当前作用域中声明了它
- 是一个指向字符串数组的指针,每个字符串表示一个环境变量
- 不需要显式包含头文件,这是因为
environ
是一个由 C 标准库(如glibc
)提供的全局变量,而不是通过头文件声明的常规符号
全局变量
- 它在程序的整个运行过程中存在,并且可以在程序的任何部分被访问的变量,但这并不意味着它在所有作用域中自动可见,需要声明
- 使用的前提是声明,但是仅仅声明是使用不了的,除非 C库中有定义;
- 编译器遇到对某个符号(变量,函数,,,)的使用时,编译器首先会在当前源文件中查找该符号的定义,若无,编译器会记录下这个未解析的符号,并在链接阶段将其传递给链接器,链接器会在其他目标文件或系统库中查找这个符号的定义
- 注意:程序不应该重新定义这些变量,因为这会与标准库中的定义冲突,导致不可预期的行为
本地变量
- 这些变量在当前的 shell 会话中全局有效
- 本地变量不会继承给子进程的环境变量
- export可以将本地变量,导出到 环境变量
本地变量与环境变量的区别
- 本地:只在bash进程内有效,不会被子进程继承
- 环境:通过让子进程继承的方式实现自身的全局性,系统的环境变量具有全局性
内建命令
概念
- 内建命令是在 Shell 本身内部实现的,像是Shell内部的函数,直接在当前的 Shell 进程中运行,这些命令能够直接访问和操作 Shell 的内部状态
- 不会创建子进程,执行风险低,由bash自己执行,可以看做bash内部的一个函数
- 常见的内建命令:echo pwd export set unset
启动时环境变量如何导入
- 系统启动程序的时候,给进程提供两张表1.命令行参数表2.环境变量表
- Shell 会按照预定义的顺序加载和执行配置文件中的脚本
用户级配置文件
- ~/.bashrc
- ~/.bash_profile
- ~/.profile
- ~/.bash_logout
系统级别的配置文件
- /etc/profile
- /etc/bash.bashrc
- /etc/environment
- /etc/profile.d/*.sh
重点
- 重点是环境变量
- getenv(),environ指针
- 全局变量的概念
- 本地变量的导出,与环境变量的区别
- 常见的内建命令,概念
- 最后一个不大会