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 )
  {
    // child
     while(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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

命名空间【C++】(超详细)

文章目录 命名空间的概念命名空间的定义命名空间定义的位置作用域每一个命名空间都是一个独立的域作用域符&#xff1a;&#xff1a; 编译器找一个变量/函数等的定义&#xff0c;寻找域的顺序为什么要有命名空间&#xff1f;1.解决库与程序员定义的同名的重定义问题2.解决程序员…

ESP32使用SPIFFS时提示:E (21) SPIFFS: mount failed, -10025

因为是首次使用SPIFFS系统&#xff0c;需要格式化分区 在初始化时加入如下代码&#xff1a; if (!SPIFFS.begin()){// 初始化失败时处理Serial.println("SPIFFS-An error occurred while mounting SPIFFS");// 格式化SPIFFS分区if (SPIFFS.format()){// 格式化成功S…

OSPF基本原理和概念

文章目录 背景知识OSPF协议概述&#xff1a;OSPF区域的表示OSPF 骨干区域 –区域0OSPF 非骨干区域 -非0区域OSPF的五种区域类型OSPF工作原理OSPF 的报文类型OSPF邻居表中的七个状态 总结 背景知识 一台路由设备如何获取其他网段的路由&#xff0c;并加入到路由表中 直连路由 …

中值定理错题本

1 2 一般要构造函数 3 4 5 6 ------------------------------ 7 8 9 10

论文笔记:Retrieval-Augmented Generation forAI-Generated Content: A Survey

北大202402的RAG综述 1 intro 1.1 AICG 近年来&#xff0c;人们对人工智能生成内容&#xff08;AIGC&#xff09;的兴趣激增。各种内容生成工具已经精心设计&#xff0c;用于生产各种模态下的多样化对象 文本&代码&#xff1a;大型语言模型&#xff08;LLM&#xff09;…

【GPT5进展】GPT-5将于今年年中发布

OpenAI即将发布的GPT-5代表了人工智能技术的一个重大进步&#xff0c;这一新一代模型预计将进一步扩大OpenAI在AI应用领域的影响力。以下是关于GPT-5的几个关键点&#xff0c;旨在清晰、简洁地向读者传达这一重要更新&#xff1a; 1. 性能和功能的实质性提升 GPT-5在性能上做…

c++使用类的一些注意事项

前言&#xff1a; 本篇内容为前面的补充&#xff0c;介绍了我们使用类时需要注意些什么以及一些编译器的优化&#xff0c;可能有些理解不到位或者错误&#xff0c;请斧正。 目录 前言&#xff1a; 1.再谈构造函数 2.&#xff08;c98&#xff09;隐式类型转换中的编译器的优…

LVS几种模式介绍

备注&#xff1a;这篇真的是水文&#xff0c;不看也罢。 LVS&#xff0c;linux virtual server&#xff0c;可提供IP网络层的负载均衡。 其主要模式主要有以下几种&#xff1a; LVS-NAT 主要通过网络地址转换&#xff0c;修改目的IP实现。Network Address Translation LVS-…

rtthread

创建线程 线程优先级 当Thread1中遇到高优先级的线程时&#xff0c;Thread会先被挂起&#xff0c;rt_thread_delay()延时一定时间&#xff0c;每延时一个tick&#xff0c;执行一次判断&#xff0c;是否超时&#xff0c;如果超时&#xff0c;则调用rt_timer_init()中的rt_thread…

先进电机技术 —— 何为轮毂电机?

一、轮毂电机 轮毂电机&#xff08;Hub Motor&#xff09;是一种将电动机集成到车轮内部&#xff0c;直接驱动车轮转动的电动车驱动技术。这种设计省去了传统的传动轴、差速器、半轴等机械传动部件&#xff0c;使得动力传输更为直接、高效。 轮毂电机的优点&#xff1a; 1. 结…

源支付V7开源版2.99,修复各种提示错误

源支付V7开源版2.99&#xff0c;修复各种提示错误 加密说明&#xff1a;200拿来的&#xff0c;只有8.1这个文件加密&#xff0c;其他文件无任何加密&#xff0c;已修复各种提示错误 测试其他开源版安装提示错误&#xff0c;有几个文件是加密的 注&#xff1a;开发不易&#…

Java8之接口默认方法

Java8之接口默认方法 一、介绍二、代码1、接口2、实现类3、测试代码4、效果 一、介绍 在Java8中&#xff0c;允许为接口方法提供一个默认的实现。必须用default修饰符标记这样一个方法。默认方法也可以调用其他方法 二、代码 1、接口 public interface PersonService {void…

自定义类型(二)结构体位段,联合体,枚举

这周一时兴起&#xff0c;想写两篇文章来拿个卷吧&#xff0c;今天也是又来写一篇博客了&#xff0c;也是该结束自定义类型的学习与巩固了。 常常会回顾努力的自己&#xff0c;所以要给自己的努力留下足迹。 为今天努力的自己打个卡&#xff0c;留个痕迹吧 2024.03.30 小闭…

数据库工具——DBeaver的安装及使用

目录 一、DBeaver介绍 1.定义 2.支持的数据库 3.支持的操作系统 4.特点 二、DBeaver安装及使用 1.服务启动 2.查看连接类型 3.演示连接Mysql数据库 4.连接配置 5.成功连接 6.远程控制 6.1新建数据库 6.2新建数据表 6.3添加字段列 6.4使用SQL编辑器进行编辑 一…

mac怎么删除python

mac 默认安装了python2&#xff1b;自己后面又安装了python3&#xff1b;为了方便&#xff0c;现在想将python3换成Anaconda3。 Anaconda是一个开源的Python发行版本&#xff0c;其包含了conda、Python等180多个科学包及其依赖项。 Python3安装之后&#xff0c;在系统中不同目…

ESD保护二极管ESD9B3.3ST5G 以更小的空间实现强大的保护 车规级TVS二极管更给力

什么是汽车级TVS二极管&#xff1f; TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护&#xff0c;防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中&#xff0c;由于车辆启…

江大白 | 万字长文,深度梳理Python多线程与多进程(建议收藏 !)

本文来源公众号“江大白”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;万字长文&#xff0c;深度梳理Python多线程与多进程 以下文章来源于博客&#xff1a;标点符 作者&#xff1a;钱魏Way 链接&#xff1a;https://www.bia…

Facebook Horizon Worlds:打造数字世界的社交乐园

在数字化时代&#xff0c;社交媒体平台已经成为人们日常生活中不可或缺的一部分。而随着科技的不断发展&#xff0c;人们对于社交体验的需求也在不断演变。在这样的背景下&#xff0c;Facebook推出了全新的虚拟现实社交平台——Facebook Horizon Worlds&#xff0c;旨在打造一个…

电脑换屏总结——关于我把电脑砸了这件事!

大家好&#xff0c;我是工程师看海&#xff0c;很高兴和各位一起分享我的原创文章&#xff0c;喜欢和支持我的工程师&#xff0c;一定记得给我点赞、收藏、分享哟。 加微信[chunhou0820]与作者进群沟通交流。 【淘宝】https://m.tb.cn/h.5PAjLi7?tkvmMLW43KO7q CZ3457 「运放秘…

利用vite创建vue3项目

vue3 项目推荐使用vue官方推荐的vite手脚架创建&#xff0c;vue3项目&#xff0c;使用vue-cli 会存在一些问题 1.node的版本 目前的vue3需要至少需要node18及以上&#xff0c;可以安装nvm node包管理器可以快速切换node版本&#xff0c;因为node的版本的兼容性真是一言难尽。…