Linux基础4-进程4(环境变量,命令行参数详解)

上篇文章:Linux基础4-进程3(进程优先级,竞争,独立,并行,并发,进程切换)-CSDN博客

本章重点: Linux中环境变量的理解和使用

目录

一. 环境变量概念和查看环境变量

1.1 环境变量概念

1.2 查看环境变量

二. 获取环境变量

2.1 getenv

2.1.1 USER环境变量

2.1.2 PWD环境变量

2.2 通过第三方变量 environ

三. 命令行参数获取环境变量

3.1 argc和argv

3.2 env

 四. 下章重点:程序地址空间


一. 环境变量概念和查看环境变量

1.1 环境变量概念

环境变量一般指的是在操作系统中用来指定操作系统运行环境的一些参数。

        比如在Linux中,ls,pwd,cd 这些命令可以直接运行。而我们自己写的可执行程序需要./程序名才能执行(即我们要找到这个程序的路径)。

        要执行一个程序,我们首先需要找到它(系统命令由于有环境变量,这些由操作系统指定的参数会在系统启动的时候就被自动运行,环境变量帮助系统命令查找进程所在路径,所以能够直接运行)而我们的命令没有环境变量帮助查找,所以不能直接运行

常见的环境变量有:

PATH:PATH是指定命令的搜索路径,在这个环境变量中的命令可以直接运行(入ls,pwd)

HOME:记录登入用户的家目录,登入系统的时候会通过HOME进入。

SHELL :当前的shell程序

1.2 查看环境变量

env 查看系统的所有环境变量

echo $环境变量名        可以查看具体的环境变量

set        可以查看本地自定义的环境变量和shell变量

export        可以设置一个环境变量,设置的环境变量仅当前有效,用户退出后会消失

unport        取消设置一个环境变量

二. 测试环境变量PATH

使用echo查看PATH,在上面路径的程序都可以直接运行

我们自己创建一个可执行程序,如何不用带路径就能执行??

1 在PATH命令中添加该可执行程序的路径即可

我们使用export将hello放到PATH中

2 将可执行程序放到PATH中的某一个系统默认路径中

二. 获取环境变量

2.1 getenv

        getenv是C语言中的一个函数,可以获取环境变量

#include <stdlib.h> //包含在这个头文件中

char *getenv(const char *name);
//返回值是name环境变量所指的值

测试代码:

2.1.1 USER环境变量

#include <stdio.h>
#include <stdlib.h>

int main()
{
  printf("%s\n", getenv("USER"));
  return 0;
}

运行结果,在普通用户中输出其用户名,在root中输出root

这说明了USER这个环境变量的意义:可以唯一标识当前使用Linux的用户

比如我们可以通过USER来确定某人是否有权限

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
  const char *who = getenv("USER");

  if(strcmp(who,"root") == 0)
  {
    printf("%s!\n", who);
  }
  else 
  {
    printf("权限不足\n");
  }
  return 0;
}

运行结果,由于我是YZC,不是root。会显示权限不足

2.1.2 PWD环境变量

系统是如何知道我们在哪一个路径??

系统通过PWD这个环境变量来维护当前路径,当我们切换目录的时候,shell会修改PWD

所以我们可以直接 ls test.c         而不需要 ls ./test.c        因为PWD会帮助ls进行

        我们知道pwd命令可以显示当前路径,我们通过PWD环境变量也可以编写一个C程序来显示当前路径

代码如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  printf("%s\n", getenv("PWD"));
  return 0;
}

如果把这个指令放到 /bin/user中 就能够相当于我们写了一个pwd指令

2.2 通过第三方变量 environ

使用environ的时候需要 extern char** environ

**的原因:environ指向的是整个环境变量表,这个表中的每一个环境变量又指向相应的路径

#include <stdio.h>
#include <stdlib.h>

int main()
{
  extern char**environ;
  int i = 0;
  for( ; environ[i]; i++)
  {
    printf("%s\n", environ[i]);
  }
  return 0;
}

运行结果如下:

我们通过 if 判断就能够使用相应的环境变量

三. 命令行参数获取环境变量

命令行有三个参数

int main(int argc, char *argv[], char *env[])
{}

其中, argv和env都是指针数组

3.1 argc和argv

我们知道,在linux中输入部分命令的时候我们可以带上参数,如:

ls -a -l -i

其中 argc就代表了参数的个数,agrv[]这个指针数组指向参数解析后的子串(即一张映射表)

如下列代码:

#include <stdio.h>
#include <stdlib.h>

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

通过argc和argv我们可以实现,带入不同的参数执行不同的功能

3.2 env

env为第三个命令行参数,这个参数是存放环境变量的指针数组,我们可以通过env获取环境变量

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[], char *env[])
{
  for(int i = 0; env[i]; i++)//由于环境变量最后为NULL,所以用env[i]即可控制循环
  {
    printf("env[%d] -> %s\n", i, env[i]);
  }
  return 0;
}

运行结果如下,可以获取环境变量

 四. 下章重点:程序地址空间

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

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

相关文章

Java学习路线:Maven(一)认识Maven

目录 认识Maven 新建Maven文件 导入依赖 认识Maven Maven是一个Java的项目管理工具&#xff0c;通过Maven&#xff0c;我们可以实现&#xff1a; 项目自动构建&#xff0c;包括代码的编译、测试、打包、安装等依赖管理&#xff0c;快速完成依赖的导入 在学习Maven之前&…

Node.js——fs模块-文件删除

1、在Node.js中&#xff0c;我们可以使用unlink或unlinkSync来删除文件。 2、语法&#xff1a; fs.unlink(path,callback) fs.unlinkSync(path) 参数说明&#xff1a; path 文件路径 callback 操作后的回调函数 本文的分享到此结束&#xff0c;欢迎大家评论区一同讨论学…

PG逻辑复制的REPLICA IDENTITY几种设置

前两天同事问了一个PG的错误&#xff0c;创建一张普通表&#xff0c;insert插入正常&#xff0c;但是执行update和delete时&#xff0c;提示这个错误&#xff0c; 代码语言&#xff1a;javascript 复制 SQL 错误 [55000]: ERROR: cannot delete from table "temp_tb&qu…

【人工智能】利用大语言模型(LLM)实现机器学习模型选择与实验的自动化

文章目录 引言环境准备数据集说明 项目结构主要文件说明 导入必要的软件包软件包功能简述 辅助函数定义加载配置文件加载数据集预处理数据集函数功能详解 集成LLM进行模型选择调用LLM的函数定义函数功能详解 清理和验证LLM的输出清理超参数建议提取模型名称验证超参数修正超参数…

机器学习在时间序列预测中的应用与实现——以电力负荷预测为例(附代码)

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 随着数据采集技术的发展&#xff0c;时间序列数据在各个领域中的应用越来越广泛。时间序列预测旨在基于过去的时间数据来…

Python学习------第四天

Python的判断语句 一、布尔类型和比较运算符 二、 if语句的基本格式 if语句注意空格缩进&#xff01;&#xff01;&#xff01; if else python判断语句的嵌套用法&#xff1a;

Vue3版本的uniapp项目运行至鸿蒙系统

新建Vue3版本的uniapp项目 注意&#xff0c;先将HbuilderX升级至最新版本&#xff0c;这样才支持鸿蒙系统的调试与运行&#xff1b; 按照如下图片点击&#xff0c;快速升级皆可。 通过HbuilderX创建 官方文档指导链接 点击HbuilderX中左上角文件->新建->项目 创建vue3…

让Apache正确处理不同编码的文件避免中文乱码

安装了apache2.4.39以后&#xff0c;默认编码是UTF-8&#xff0c;不管你文件是什么编码&#xff0c;统统按这个来解析&#xff0c;因此 GB2312编码文件内的中文将显示为乱码。 <!doctype html> <html> <head><meta http-equiv"Content-Type" c…

LabVIEW实验室液压制动系统

压制动系统是许多实验设备的重要安全组件&#xff0c;尤其在高负荷、高速实验环境下&#xff0c;制动系统的性能对设备和操作人员的安全至关重要。传统的实验室液压制动系统监测方法存在数据采集实时性差、精度低、故障预警不及时等问题。为了提高实验安全性和设备运行的稳定性…

Qt教程(007):资源文件添加

文章目录 7.1 创建新的项目7.2 添加资源文件7.2 设置页面7.1 创建新的项目 选择创建项目类型 输入项目名称 勾选UI界面 7.2 添加资源文件 选中项目名称,右键,选择【Add New】 添加资源文件 选择Qt Resource File文件

【Python爬虫实战】深入解锁 DrissionPage:ChromiumPage 自动化网页操作指南

&#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、ChromiumPage基础操作 &#xff08;一&#xff09;初始化Drission 和 ChromiumPage 对象 &#xff0…

如何保证kafka生产者数据可靠性

ack参数的设置&#xff1a; 0&#xff1a;生产者发送过来的数据&#xff0c;不需要等数据落盘应答 假如发送了Hello 和 World两个信息&#xff0c;Leader直接挂掉&#xff0c;数据就会丢失 生产者 ---> Kafka集群 一放进去就跑 数据可靠性分析&#xff1a;丢数 1&#…

python爬虫指南——初学者避坑篇

目录 Python爬虫初学者学习指南一、学习方向二、Python爬虫知识点总结三、具体知识点详解和实现步骤1. HTTP请求和HTML解析2. 正则表达式提取数据3. 动态内容爬取4. 数据存储5. 反爬虫应对措施 四、完整案例&#xff1a;爬取京东商品信息1. 导入库和设置基本信息2. 获取网页内容…

C 语言学习-05【数组】

1、一维数组元素的操作 输入一个数&#xff0c;按原来排序的规律将它插入到一个一排列好的数组中&#xff1a; #include <stdio.h>int main() {int i, data, a[10] {2, 3, 6, 9, 11, 12, 14, 17, 19};printf("Primitive series: \n");for (i 0; i < 9; i)…

C 语言学习-1【基本语法】

1、符号常量 #define 符号常量名 常量 使用符号常量计算圆柱体的体积&#xff1a; #include <stdio.h> #define PI 3.1415926int main() {float r, h, volum;printf("Please enter the radius: ");scanf("%f", &r);printf("Please enter th…

【微服务】不同微服务之间用户信息的获取和传递方案

如何才能在每个微服务中都拿到用户信息&#xff1f;如何在微服务之间传递用户信息&#xff1f; 文章目录 概述利用微服务网关做登录校验网关转微服务获取用户信息openFeign传递微服务之间的用户信息 概述 要在每个微服务中获取用户信息&#xff0c;可以采用以下几种方法&#…

HarmonyOS入门 : 获取网络数据,并渲染到界面上

1. 环境搭建 开发HarmonyOS需要安装DevEco Studio&#xff0c;下载地址 : https://developer.huawei.com/consumer/cn/deveco-studio/ 2. 如何入门 入门HarmonyOS我们可以从一个实际的小例子入手&#xff0c;比如获取网络数据&#xff0c;并将其渲染到界面上。 本文就是基于…

SpringMVC总结 我的学习笔记

SpringMVC总结 我的学习笔记 一、SpringMVC简介1.MVC2.SpringMVC概述3. SpringMVC中的核心组件4.SpringMVC核心架构流程 二、SpringMVC框架实例具体实现使用注解实现 四、数据处理及跳转1.结果跳转方式2.处理器方法的参数与返回值处理提交数据数据显示到前端 五、RestFul风格1.…

Qml 模型-视图-代理(贰)之 动态视图学习

Repeater 元素适合有限的静态数据&#xff0c; QtQuick 提供了 ListView 和 GridView, 这两个都是基于 Flickable(可滑动) 区域的元素 &#xff0c; ListView 与 Repeater 相比&#xff0c; ListView 使用了一个 model&#xff0c; 使用delegate 来 实例化&#xff0c;并且在两…

rce代码层面

目录 RCE的分类Remote Code Execute 远程代码执⾏php Remote Command Execte 远程命令执⾏php shell的相关知识管道重定向fd反弹shell linux进程的创建c/php/python下的system()/popen()函数python的subprocess.call函数java的Runtime.getRuntime().exec和ProcessBuilder()命令…