快手官方网站音乐人怎么做,能源建设网站,百度搜索竞价,深圳有几个区县Linux: 命令行参数和环境变量究竟是什么#xff1f; 一、命令行参数1.1 main函数参数意义1.2 命令行参数概念1.3 命令行参数实例 二、环境变量2.1 环境变量概念2.2 环境变量#xff1a;PATH2.2.1 如何查看PATH中的内容2.2.2 如何让自己的可执行文件不带路径运行 2.3 环境变量… Linux: 命令行参数和环境变量究竟是什么 一、命令行参数1.1 main函数参数意义1.2 命令行参数概念1.3 命令行参数实例 二、环境变量2.1 环境变量概念2.2 环境变量PATH2.2.1 如何查看PATH中的内容2.2.2 如何让自己的可执行文件不带路径运行 2.3 环境变量PWD2.3 环境变量: HOME 三、获取环境变量的3种方式3.1 getenv()函数3.2 main函数传参3.3 通过第三方变量environ获取extern char** environ 四、环境变量如何获取4.1 子进程环境变量获取方式4.2 父进程环境变量获取方式 五、本地变量和环境变量六、Linux命令分类和环境变量相关的命令 一、命令行参数 在main函数中我们可以给main函数传递3个参数(库函数头为main(int argc, char *argv[], char *env[]))这里我们只用前两个参数。那究竟如何给main函数传递参数呢每个参数分别表示什么
1.1 main函数参数意义 main函数中argc表示指针数组arvg中有效元素的个数。接下来我们来看一段代码
#include stdio.h
#include string.h
#include stdlib.hint main(int argc, char* argv[])
{ int i 0; for(; i argc; i) { printf(%d: %s\n, i, argv[i]); }
} 【运行现象】
1.2 命令行参数概念 1.1中main()函数在运行时我们输入的指令会被bash或shell当成一个大的字符串并以空格的形式分割成若干个小的字符串。而这些小字符串会形成一张指针数组表bash或shell会指针数组有效个数传给argc参数指针数组表地址传给argc参数。 我们在来看看系统指令现象来对比上述mian函数。 我们将上述这种ls、ls -l 、ls -l -a称之为命令行参数。输入的指令会被bash或shell以空格分割成小字符串并形成一种指针数组表用于存放每一个小的字符串并将该指针数组的有效个数传递给mian函数的argc参数而指针数组表的地址传递给argv参数。其中./mybin、ls这种为可执行程序、其他的为选项。命令行参数可以让同一段代码通过不同的选项来实现不同的功能
1.3 命令行参数实例 下面我们希望一段代码通过不同的指令来实现简单的计算器。其中格式为可执行程序 功能参数(add、sub、mul、div) 两个参与运算的数据d1 d2。 显然我们需要给mian函数中有效字符的个数为4此时我们仅需比较argv[1]传递的字符串是什么即可判断对于的功能选项。下面我们来看看如何实现吧
#include stdio.h
#include string.h
#include stdlib.hint main(int argc, char *argv[])
{ if(argc ! 4)//传入数据错误显示正确使用手册 { printf(Use error\nUsage %s op[-add|sub|mul|div] d1 d2\n, argv[0]); return 1; } int x atoi(argv[2]);//将字符窜转整型 int y atoi(argv[3]); if(strcmp(argv[1], add)0) { int result x y; printf(%d %d %d\n, x, y, result); } else if(strcmp(argv[1], sub)0) { int result x - y; printf(%d - %d %d\n, x, y, result); } else if(strcmp(argv[1], mul)0) { int result x * y; printf(%d * %d %d\n, x, y, result); } else if(strcmp(argv[1], div)0) { if(y 0)//非法数据、除数为0{printf(%d/%derror! div zero\n, x, y);}else {int result x / y;printf(%d / %d %d\n, x, y, result);}}else{printf(Use error\nUsage %s op[-add|sub|mun|div] d1 d2\n, argv[0]);}return 0;
}【测试结果】 二、环境变量 在shell中对于系统指令ls、pwd的我们直接在命令行输入相关指令便可执行对于的功能但对于用于自己编写的可执行程序运行时必须在前加./来指令程序的相对路径。而这种差异就和环境变量有关
2.1 环境变量概念 环境变量(environment variables)一般是指在操作系统中用于指定操作系统运行环境的一些参数。环境变量通常具有特殊用途并且具有全局特性 比如我们在编写C/C程序时我们不知道、也不关心所谓的动/静态库在哪里。但我们每次都能编译成功形成可执行程序。原因在于有相关的环境变量帮助编译器进行查找
下面我们来看看操作系统中究竟有哪些常见的环境变量
2.2 环境变量PATH PATH是用于指定系统搜索路径的环境变量。 在命令行参数讲解中有一个小细节。系统指令可以直接只需在命令行输入相关指令便可执行对于的功能而我们自己的可执行程序必须在前面加./否则会报错:command not found。这是为啥呢 原因在于运行一个可执行程序前操作系统需要得到该可执行程序的路径 。这只是为啥我们自己的可执行程序必须加./才能运行。至于系统指令原因在于环境变量PATH中保存着一系列系统搜索路径。运行系统指令时操作系统会依次搜索PATH中保存的路径只要PATH中保存了当前指令的存在路径程序便可以运行成功
2.2.1 如何查看PATH中的内容 我们可以通过指令echo $PATH来查看PATH中保存的内容。PATH保存的路径会以冒号作为分割符将路径分隔开 2.2.2 如何让自己的可执行文件不带路径运行
$emsp;让自己的可执行程序不带路径运行通常由两种方法将可执行文件路径添加到PATH环境变量中、将可执行文件拷贝到系统的指定路径下
【将可执行文件路径添加到PATH环境变量】 我们可以通过指令PATHPATH可执行文件路径将可执行文件路径添加到PATH环境变量 上述行为都是对内存中的数据进行操作。默认更改的环境变量、仅限于本次登录
【将可执行文件拷贝到系统的指定路径下】 tips:
上述将指定文件拷贝到系统指定路径下的行为也被称为程序安装!系统运行可执行程序时默认会在环境变量和系统指令路径下进行查找
2.3 环境变量PWD
$emsp;我们在来看看下面这些指令 我们发现pwd指令每次都能成功获取到当前工作坐在路径这时为何 原因在于系统中存在一个环境变量PWD该环境变量用于保存用户的当前工作路径。每次执行pwd执行时pwd会读取环境变量PWD中的内容并回显给用户
2.3 环境变量: HOME 我们每次在登录shell时为什么对于root账号所处工作目录为/root而对于普通用户则是/home xxx? 原因在于系统中存在某些环境变量在我们还未登录时就已经被加载了。这些变量是由操作系统的配置文件或命令行参数指定的。当用于登录shell时该环境变量会识别出用户的身份从而初始化环境变量HOME。最后shell直接通过cd $HIME达到上述现象。 shell环境变量加载流程
三、获取环境变量的3种方式 在Linux中我们可以通过env指令来查看当前进程中的所有环境变量。而获取环境变量通常有以下3种方式。
3.1 getenv()函数 在Linux中提供一个名为getenv函数char *getenv(const char *name);该函数可以获取环境变量中的内容。
例如 【源代码】
int main(int argc, char *argv[], char *env[])
{ printf(PATH:%s\n, getenv(PATH));; return 0;
}【运行结果】
3.2 main函数传参 在命令行参数中我们已经提到过mian函数可以传3个参数mian函数原型为main(int argc, char *argv[], char *env[])。 程序在启动时系统可以选择的给进程(main函数)提供两张表命令行参数表(argc维护)、环境变量表(env维护)。
【源代码】
#include stdio.hint main(int argc, char *argv[], char* env[])
{for(int i 0; env[i]; i)printf(env[%d]: %s\n, i, env[i]);return 0;
}【运行结果】
3.3 通过第三方变量environ获取extern char** environ 在shell中环境变量会以写时拷贝的方式继承给子进程。换而言之环境变量具有全局属性父子进程以写时拷贝的方式看到同一种环境变量表。 那子进程如何“继承”的环境变量表呢 libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。
实例 【源代码】
#include stdio.hint main()
{extern char **environ;for(int i 0; environ[i]; i)printf(environ[%d]: %s\n, i, environ[i]);return 0;
}【运行结果】
四、环境变量如何获取
4.1 子进程环境变量获取方式 命令行启动的进程都是shell或bash的子进程而子进程的环境变量都是父进程以命令行参数的形式传递给子进程的。
4.2 父进程环境变量获取方式 在shell中直接修改环境变量PATH虽然可行但这是直接更改shell进程内部的环境变量信息。在下一次登录时该修改值会被恢复 这是由于父进程准确的来说是shell每次重新登录时都会形成新的bash解释器并且bash解释器会自动读取配置文件./.bash_profile在家目录下中的信息为shell进程形成一张环境变量表即父进程shell的环境变量信息是以脚本配置文件的形式存在的
五、本地变量和环境变量 在shell中除了系统默认的环境变量也可以手动添加环境变量
【例如】
MYENVhelloLinux当上述添加的环境变量并未添加到环境变量表中被称为本地变量。使用export指令可以将本地变量导入环境变量表中变为环境变量即export MYENV。 本地变量只在bash进程内部有效不会被子进程所继承而环境变量通过让所有子进程继承的方式实现全局性
六、Linux命令分类和环境变量相关的命令 在Linux中Linux命令分为常规命令和内建命令。
命令种类用途常规命令fork让子进程执行的。具体表现在对环境变量PATH清空后诸如ls、cd、mkdir、touch等指令失效内建命令shell内部的一个函数可以直接读取shell内部的本地变量。如export、pwd等
环境变量相关的命令
命令种类用途echo显示某个环境变量值export设置一个新的环境变量env显示所有环境变量unset清除环境变量set:显示本地变量和环境变量