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

秦jh_ 2024-09-16 16:07:09 阅读 50

     🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343

🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html

9efbcbc3d25747719da38c01b3fa9b4f.gif

目录

 命令行参数

为什么会有命令行参数 

环境变量

常见环境变量 

查看环境变量方法 

和环境变量相关的命令 

环境变量的组织方式

 环境变量通常是具有全局属性的

内建命令


前言

💬 hello! 各位铁子们大家好哇。

             今日更新了Linux命令行参数和环境变量的内容

🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

 命令行参数

我们平时写的main函数没有参数,其实它是有参数的。

int main(int argc, char* argv[])

括号里的int argc, char* argv[]  ,就是命令行参数。

运行后发现,直接./myprocess 下标就是0,->指向./myprocess 。如果后面加上-a选项,下标1就会指向-a,以此类推。参数1就是数组的元素个数,参数2就是指针数组。

我们把这一整行叫做命令行字符串,第一部分的字符串,由程序的路径+名称组成。后面部分代表选项。

argv是一个变长数组,我们有几个字符串,argc就是多少。它会以空格为分隔符,把这些字符串传到argv里,然后以参数的形式传到main函数。这个数组,最后都会以NULL为结尾。

下面是验证以NULL为结尾:

结果证明,确实是以NULL结尾。

为什么会有命令行参数 

 运行上面的程序,可以发现,它的用法跟我们的ls -l ,ls -a等指令一样。让一个程序通过不同的选项,实现不同的子功能。

本质:命令行参数的本质是我们交给程序不同的选项,用来定制不同的程序功能。命令行中会携带很多选项。

 

 由上图可以得出一个结论:父进程的数据,默认能被子进程看到并访问。

并且父进程的父进程是bash。

当我们把程序换成之前的选项,发现该进程的ppid也是7241,也就是bash的子进程。

由此可以得出:命令行中启动的程序,都会变成进程,并且都是bash的子进程。

所以,我们平常写的命令行字符串,默认都是输入给父进程bash的,因此bash也叫命令行解释器。

环境变量

如下图,为什么我们写的程序,运行时需要./,而系统的指令却不需要./就可以运行呢? 

Linux中,存在一些全局的设置, 告诉命令行解释器,应该去哪些路径下寻找可执行程序。

常见环境变量 

PATH : 指定命令的搜索路径HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)SHELL : 当前Shell,它的值通常是/bin/bash。 

查看环境变量方法 

echo $NAME  。 NAME就是环境变量名称,注意都是大写的。

系统中的很多配置,在我们登录Linux系统的时候,已经被加载到bash进程中(内存)

bash在执行命令的时候,需要先找到命令,因为未来要加载。

因为ls命令是在/usr/bin/ls目录当中的,已经在PATH环境变量中了,所以就不需要./。而我们写的程序,并不在PATH环境变量中。

如果我们想让我们的命令跟系统指令一样不需要./该怎么办?

我们可以把程序的启动路径拷贝到在PATH中的路径下,这就相当于我们把我们写的程序,安装到Linux系统里。这种方法不推荐。

PATH后面可以直接赋值,如上图。如果直接赋值,会导致我们的其他系统指令无法使用,我们需要关闭xshell,重新登陆,就会恢复了,因为默认查到的环境变量都是内存级的

为了避免上面的问题,我们不能直接赋值,而是PATH=$PATH:路径。不过当我们重新登陆时,路径又恢复原样了。

原因:最开始的环境变量不是在内存中,而是在系统对应的配置文件中。

当我们每次登录Linux时,配置文件会拷贝一份到bash进程中,里面的内容就包括PATH。所以即使我们修改了环境变量的内容,每次登录又会恢复,这就是因为我们没有修改系统的配置文件。

在用户的家目录下,有两个隐藏的配置文件,如上图。这些配置文件会被bash进程统一导入到上下文里。

所以,如果我们想每次启动的时候都可以直接myprocess,直接修改配置文件即可。 

环境变量相关的命令 

echo: 显示某个环境变量值 export: 设置一个新的环境变量env: 显示所有环境变量 unset: 清除环境变量set: 显示本地定义的shell变量和环境变量 

上方是设置和清除环境变量的例子。因为这个操作没有修改配置文件,所以可以随便用。

如上图,hello前面没有加上export,并没有报错。它没有导到环境变量中,但是依旧存在,在bash内部,这种变量叫本地变量。

本地变量只在本bash内部有效,无法被子进程继承下去。只有导成环境变量,此时才能够被获取。

环境变量的组织方式

 使用env查看所有环境变量

运行上面代码,发现这些环境变量就是刚刚shell内部的环境变量。

由此可得,环境变量默认是可以被子进程拿到的。

环境变量们默认是在bash内部。

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。

我们用man指令,可以看到environ是char**类型,因为指向的元素类型都是char*。 

 下面是另一种获取环境变量的方式:

可以在main函数传第三个参数,运行后即可得到相同的结果。

下面还有一种获取方式:

 

通过getenv函数可以直接访问特定的环境变量

 环境变量通常是具有全局属性的

环境变量具有系统级的全局属性,可以被子进程继承下去。 

内建命令

 大部分命令都是bash创建子进程执行的。只有少部分命令由bash亲自执行,不会创建子进程,比如上面的export,echo等内建命令。所以export命令才会把环境变量导到bash里面,从而被所以的子进程继承。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。