网站建设所学内容,广州建网站费用,怎么制作网站视频播放器,上海高档网站建设这是写的第二篇环境变量博客#xff0c;写了一年多了#xff0c;第一次出现把自己博客删了的情况#xff0c;不知道为什么明明发表了#xff0c;然后就把草稿箱和回收站的删了#xff0c;结果晚上发现没发表#xff0c;回收站删除是无法找回的#xff0c;以后还是要慎重… 这是写的第二篇环境变量博客写了一年多了第一次出现把自己博客删了的情况不知道为什么明明发表了然后就把草稿箱和回收站的删了结果晚上发现没发表回收站删除是无法找回的以后还是要慎重点。
一 常见环境变量 1 PATH 为什么我们在执行自己的可执行程序时往往要带上路径呢? 为什么执行ls指令就不用带路径呢?其实就是环境变量PATH的原因我们打印看看PATH里面发现有很多路径。 其中有个路径是/usr/bin恰好就是ls可执行文件所在的位置实际上就是ls这些指令会默认去PATH中的路径查找文件而我们的文件的路径不在其中所以必须告诉bash路径才能去执行。 那如何添加呢,如下:但如果是PATH/home/hqy则会覆盖里面的路径。 如下,我们自己的test2这个可执行程序就可以不带路径了但是有点奇怪的是有一个test文件却还是要带路径执行。 2 HOME 每次我们登录上shell的时候我们就默认到了某个目录下这个目录其实称为家目录而这个家目录就是HOME维护的每次登录时bash自动cd到这个目录下。
3 其余环境变量 env就可以显示所有的环境变量。 HISTSIZE3000指的是会保留历史上使用过的指令最多三千条这个挺好用的用-和-就可以找指令有时候还挺方便的。USERhqy这个保存的是当前用户名还有那个一大团的是ls的配色方案所以ls显示出的目录可执行程序会带颜色。
4 和环境变量相关的指令
export 加上变量名会增加一个环境变量unset则会删除至于env则是显示全部的环境变量。
二 环境变量和进程 环境变量并不是凭空冒出来的它其实已经存在我们身边很久了这就得先说说main函数的参数了。main函数其实是有参数的诶那为什么我没写过形参不报错呢?简单理解就是main函数其实是被进程起的CRT_Start()等函数调用的或许进程在用CRT_start()函数调用main函数时提前看了看你有没有写参数没写那我就不传写了我就传参。 那main函数的参数究竟是什么呢?我们运行一下test这个程序。 先前已经在初识父子进程中提过./test其实是bash起了个子进程去执行代码bash会先对我们输入的指令做解析按空格分割成一个一个的字符串然后存到一个指针数组中最后传给main函数的argv参数而argc则是分割后的字符串个数。 诶我好好./test运行我的可执行程序不行吗我好端端输入-a -l -b干嘛回忆下ls命令ls可以执行ls -a -l也可以执行但是ls -a -l和ls执行的是不同的代码我们将ls -a -l 称为命令行参数而-a -l则是选项这个参数就是为了在ls代码块判断然后执行不同的代码显示不同的信息如下图: 这就是选项的意义而argv数组就是用来支持选项的。到了后面实现shell的时候我们就能理解指令带ls的用处以及带-a -l的作用。 而环境变量就和第三个参数env有关它内部又是什么呢?我们打印看看。 原来是环境变量可是我本来就能用getenv获取环境变量啊再传个这个参数给我干什么呢?其实这个是为了后面我们可能想要用自己的环境变量表就设置了这么一个参数用来接收怎么传要到程序替换再提及。 三 其余概念补充
1 全局属性 bash的环境变量具有全局属性:嘶这句话如何理解呢?我们之前说./test这样运行的可执行程序是bash的子进程这个子进程共享父进程的代码和数据环境变量实质上也是数据所以子进程也能用这就是为什么子进程getenv可以看到bash的环境变量的原因。测试如下我们给bash导入一个环境变量然后看看子进程有没有继承到。 导入成功了./test运行下看看有没有。 有说明猜想正确。而所有我们在shell运行的程序都是bash的子进程或者子进程的子进程这样不断地父传子最后所有的进程如果不修改那就都能看到bash的环境变量这就是全局属性。
2 本地变量和环境变量 还有种变量称为本地变量本地变量并不会被子进程所继承只能给当前进程使用。MAX11111111111111这个就是定义一个本地变量我们env一下就会发现环境变量表中没有这个MAX变量子进程也看不到。 3 内建命令介绍 有些指令其实是不适合让bash去起子进程执行的简单理解内建命令就是bash内的一个函数没有fork子进程去执行代码。 1 cd命令 cd命令是改变进程的工作目录cwd而环境变量PWD是改变后顺便更新的如果这个时候起了子进程去chdir这个时候就变成改变子目录的cwd了测试cd 是改变cwd得会用程序替换才可以复现实验具体就是我分别用chdir和getenv(PWD)分别改变工作目录和环境变量再用ls指令替换后面的代码我们会发现ls显示的目录的信息是随着chdir改变的而与是否改变环境变量无关。 2 echo命令 为什么说echo命令也是呢就是因为shell的echo可以打印本地变量如果bash创建了子进程去执行是无法打印bash的本地变量的不过我们在系统路径下却可以找到一个echo的可执行程序不是说是个函数吗怎么还有个可执行文件呢?个人感觉echo在打印时会做判断在打印本地变量时不会创建子进程但是有时候却会创建子进程例如重定向的时候。 3 export命令 MAX11111111111111这样只是定义一个本地变量要想定义一个环境变量得用export变量而且export肯定是给bash导入的如果创建子进程导入环境变量会发生写时拷贝这样就不是给bash导入的了诶我就不想给bash导如果export是给子进程导那有一天我想给bash导入呢难道给bash创建个父进程吗。 后面在进程部分环境变量也起到不小的作用后续使用再介绍。