前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Linux】命令行参数和环境变量

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

作者头像
秦jh
发布2024-09-10 08:45:21
710
发布2024-09-10 08:45:21
举报
文章被收录于专栏:c语言,c++

前言

💬 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,直接修改配置文件即可。

和环境变量相关的命令

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. 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里面,从而被所以的子进程继承。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 命令行参数
    • 为什么会有命令行参数
    • 环境变量
      • 常见环境变量
        • 查看环境变量方法
          • 和环境变量相关的命令
            • 环境变量的组织方式
              • 环境变量通常是具有全局属性的
                • 内建命令
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档