【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
目录
命令行参数
为什么会有命令行参数
常见环境变量
查看环境变量方法
和环境变量相关的命令
环境变量的组织方式
环境变量通常是具有全局属性的
内建命令
前言
💬 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内部有效,无法被子进程继承下去。只有导成环境变量,此时才能够被获取。
环境变量的组织方式
运行上面代码,发现这些环境变量就是刚刚shell内部的环境变量。
由此可得,环境变量默认是可以被子进程拿到的。
环境变量们默认是在bash内部。
libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。
我们用man指令,可以看到environ是char**类型,因为指向的元素类型都是char*。
可以在main函数传第三个参数,运行后即可得到相同的结果。
下面还有一种获取方式:
环境变量通常是具有全局属性的
环境变量具有系统级的全局属性,可以被子进程继承下去。
内建命令
大部分命令都是bash创建子进程执行的。只有少部分命令由bash亲自执行,不会创建子进程,比如上面的export,echo等内建命令。所以export命令才会把环境变量导到bash里面,从而被所以的子进程继承。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。