LInux|命令行参数|环境变量

LInux|命令行参数|环境变量

  • 命令行参数
    • main的参数之argc,argv
    • 几个小知识
      • <font color=#0099ff size = 5 face="黑体">1.子进程默认能看到并访问父进程的数据
      • <font color=#4b0082 size = 5 face="黑体">2.命令行创建的程序父进程都是bash
  • 环境变量
    • 怎么才能让我们的命令和系统的一样?
  • 见见更多的环境变量
  • 自定义环境变量
  • 代码获取环境变量
    • environ 全局变量
    • main的第三个参数
    • getenv() 获得单个的环境变量
  • 内建命令

可能我们在最开始学c语言的时候会看到下面这种写法

命令行参数

int main(int argc char * argv)
{
//...
}

这种写法的参数什么意思了? main函数的参数其实是命令行参数


int main(int  argc, char* argv[])
{for (int i = 0; i < argc; i++){printf("argv[%d]->%s\n", i, argv[i]);}return 0;
}

在这里插入图片描述

我们在命令行里输入的都是字符串

main的参数之argc,argv

argv是一个数组,里面的元素是char* 的指针,这里char*的指针用来指向字符串。 argc是argv数组的元素个数
注意 argv 最后一个元素为空
我们可以根据 argc 和 argv 实现 同一个程序实现不同的选项

#include<string.h> 
#include<stdio.h>
int main(int  argc, char* argv[])
{if (argc != 2){printf("useage:[-a -b ]\n");return 1;}if (strcmp(argv[1], "-a") == 0){printf("this is function1\n");}else if (strcmp(argv[1], "-b") == 0){printf("this is function2\n");}else{printf("there is no this function\n");}return 0;
}

在这里插入图片描述


几个小知识

1.子进程默认能看到并访问父进程的数据

#include<string.h> 
#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
int g_bal = 100;
int main( int  argc, char *argv[])
{printf("I am father process,pid:%d,getppid:%d ,g_bal:%d\n",getpid(),getppid(),g_bal);pid_t id = fork();sleep(5);if(id == 0 ){// childwhile(1){printf("I am child process,pid:%d,g_bal:%d\n",getpid(),g_bal);sleep(5);}}else {      while(1){printf("I am father process,pid:%d,g_bal:%d\n",getpid(),g_bal);sleep(5);}}return 0;   
}

这个代码的现象就是 子进程也能打印出100
在这里插入图片描述


2.命令行创建的程序父进程都是bash

我们多次 启动这个程序 可以看到 pid 不同但是ppid 却是相同的(可能有机器不一样 我的bash进程的pid是25663)bash其实就是命令行解释器,bash读了字符串之后交给了子进程。
在这里插入图片描述


环境变量

我们知道 ls 也是程序 为什么我写的程序要./才能运行 而ls这种不需要呢?当然我们也可以带绝对路径运行ls /usr/bin/ls Linux环境下存在一些全局的设置,告诉命令行解释器去哪些路径下找可执行程序 系统中很多配置,在我们登陆Linux的时候已经被加载到bash(内存)中了。 PATH环境变量,想打印它的内容必须上$

怎么才能让我们的命令和系统的一样?

方案一 我们可以把可执行文件拷贝到usr/bin目录下,这相当于把我们的程序安装到Linux系统里 我们不建议这么干 因为会污染指令集
在这里插入图片描述
方案二 我们可以修改PATH的值PATH=/home/lj/lesson13这相当于把PATH原来的值覆盖了,导致系统找不到ls等系统指令了但是不用担心,我们重新登陆Linux又恢复原来的样子了因为 bash 是从一个文件中读取的环境变量,我们这里修改的只是内存级的 那我们怎么才能保存原先的值呢? PATH=$PATH:/home/lj/lesson13 但是这样还是没修改文件,我们才能让他永久有效呢 修改家目录的.bash_profile文件
在这里插入图片描述

见见更多的环境变量

  • HOME 记录该用户的家目录
  • PWD 记录该用户所在的路径
  • SHELL 查看所用的哪种解释器
  • HISTSIZE 记录最新的1000条历史指令

如果我们想看更多的环境变量可以使用 env命令
我们如果想自己定义环境变量也是可以的


自定义环境变量

export 环境变量名 = 值
在这里插入图片描述
如果不加exportecho这样能查到但是没有导入在.bash_profile文件里则称为本地变量

代码获取环境变量

environ 全局变量

#include<string.h> 
#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
#include <stdio.h>
int main(int argc, char *argv[])
{extern char ** environ;int i = 0;for(; environ[i]; i++){printf("%s\n", environ[i]);}return 0;
}

这个运行出来和我们用env命令一样的 这表明bash的子进程也能读取到环境变量,则并不奇怪因为最开始环境变量在文件里,bash读到该进程中,子进程本来就能访问父进程里面的数据
为什么是char**?
因为每个数组元素是char * 要想指向这张环境变量表只能是char**
在这里插入图片描述

main的第三个参数

main函数默认会生成两张表一张是环境变量表另一张是命令行参数表

#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{int i = 0;for(; env[i]; i++){printf("%s\n", env[i]);}return 0;
}

getenv() 获得单个的环境变量

#include <stdio.h>
#include <stdlib.h>
int main()
{printf("%s\n", getenv("PATH"));return 0;
}

在这里插入图片描述

内建命令

LInux中百分之八十的命令都是bash创建子进程执行的,剩下的命令相当于是bash内部的函数这称为内建命令 我们子进程新产生的数据 父进程是看不到的
我们的echo,export都是内建命令 正因为export没有创建bash的子进程才能将数据导给bash

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/571674.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】快速入门 数据类型 常用指令 在Java中操作Redis

文章目录 一、简介二、特点三、下载与安装四、使用4.1 服务器启动4.2 客户端连接命令4.3 修改Redis配置文件4.4 客户端图形化界面 五、数据类型5.1 五种常用数据类型介绍5.2 各种数据类型特点 六、常用命令6.1 字符串操作命令6.2 哈希操作命令6.3 列表操作命令6.4 集合操作命令…

你的 Python 代码需要解释一下了!

Python 是一种相对简单的编程语言。它主要以解释型语言著称&#xff0c;这意味着每行代码都要通过解释器逐行执行。不过在某些时候&#xff0c;将 Python 代码翻译成计算机可以理解的内容&#xff0c;然后再逐行执行&#xff0c;可以减少繁琐。 在这种情况下&#xff0c;编译器…

PostgreSQL中控制文件的解析与恢复

最近遇到有人问起PG中控制文件的一些使用问题,总结了一下。 1、PG控制文件简介 1.1、存储的位置 它的路径位于: 相关信息,可以用命令pg_controldata得到: [10:41:27-postgres@centos2:/var/lib/pgsql/14/data/global]$ pg_controldata -D $PGDATA pg_control version …

三位数组合-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第42讲。 三位数组合&#…

AI新工具(20240327) 自动生成带有精确躯干和手部动作的主播风格视频;新型AI搜索thinkany.ai;小米发布图像生成技术SDXS

✨ 1: Make-Your-Anchor 自动生成带有精确躯干和手部动作的主播风格视频 Make-Your-Anchor是一种革新性的系统&#xff0c;它允许用户仅使用一个人为期一分钟的视频片段进行训练&#xff0c;进而自动生成带有精确躯干和手部动作的主播风格视频。这样的系统特别适合于需要产生…

scrapy爬虫框架

scrapy爬虫框架 一、scrapy的概念作用和工作流程1、scrapy的概念2、scrapy框架的作用3、scrapy的工作流程&#xff08;重点&#xff09;3.1 回顾之前的爬虫流程3.2 改写上述流程3.3 scrapy的流程3.4 scrapy的三个内置对象3.5 scrapy中每个模块的具体作用 二、scrapy的入门使用1…

MySQL数据库高阶语句②

目录 一.子查询与多表查询 1.子查询 2.update子查询 3.多表查询 4.delete子查询 5.exists关键字也用于子查询 6.结果集 二.MySQL视图 1.定义 2.作用场景 3.视图与表的区别与联系 &#xff08;1&#xff09;区别 ①视图是已经编译好的sql语句。而表不是 ②视图没有…

Java_17 两数之和

两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任…

CentOS 7 下安装RabbitMQ教程

CentOS 7 下安装RabbitMQ教程 一、做准备&#xff08;VMWare 虚拟机上的 CentOS 7 镜像 上安装的&#xff09; &#xff08;1&#xff09;准备RabbitMQ的安装包&#xff08;rabbitmq-server-3.8.5-1.el7.noarch&#xff09;下载地址mq &#xff08;2&#xff09;还得准备erl…

单页面应用部署到iis上可以正常打开,刷新就404

当您遇到Dumi打包的网站部署到IIS上可以正常打开首页,但刷新页面时出现404错误的情况,这通常与以下几个方面有关: 路由处理: Dumi生成的项目通常基于SPA(Single Page Application)架构,使用前端路由来实现无刷新导航。这意味着大部分页面切换是在浏览器层面完成的,而不…

惠海 H6218L 降压芯片 支持宽压24V30V36V48V60V72V120V输入,转3.3V5V12V4A 大电流

降压芯片&#xff08;也称为DC-DC转换器或电压调节器&#xff09;是一种电子设备&#xff0c;用于将较高的输入电压降低到所需的输出电压。根据您提供的信息&#xff0c;这种降压芯片支持多种宽范围输入电压&#xff0c;包括24V、30V、36V、48V、60V、72V和120V&#xff0c;并能…

arduino 2.0以上版本上传项目data目录内文件到ESP8266闪存中

开发测试环境&#xff1a; arduino IDE : 2.3.2 开发板 ESP8266 系统&#xff1a;WINDOWS 10 截止目前&#xff0c;arduino版本为2.3.2&#xff0c;在开发项目的时候&#xff0c;发现一个问题&#xff0c;就是项目目录中data内的文件没有办法和主文件.ino一同上传到ESP8266的f…