【Linux】-- 环境变量

news2024/11/17 11:22:36

目录

环境变量

常见环境变量

HOME

和环境变量相关的命令

通过代码如何获取环境变量

环境变量参数

通过第三方变量environ获取

通过getenv函数来特定访问获取

通过setenv函数来特定访问获取


环境变量

命令:which ls


将命令ls的完整路径写入到标准输出。

#include <stdio.h>
int main()
{
    while(1)
    {
        printf("hello world\n");
        sleep(1);
    }
    return 0;
}

        都是可执行程序,但是系统自带可执行程序能直接运行,而我们写的可执行程序需要带路径。

  • 初识:

        系统命令可以直接运行,我们自己写的程序必须带路径!

  • 问题:

        如果不想带?如果我们想让和运行一个普通命令一样,可以运行我们的程序该怎么办?

(以环境变量PATH为例)

查看环境变量方法

命令:echo $NAME   //NAME:环境变量名称


查看环境变量名称中所存储的环境变量

        因为如果想让系统运行一个命令,必须先找到它,所以不带路径,系统就没办法找到我们所写的程序,而系统的命令是默认可被找到的。原理就是利用环境变量。

命令:echo $PATH


查看PATH中所存储的环境变量

        系统执行ls命令,即找到类似的位置,系统会在环境变量内以' : '为分割,经过一一对应的在每段路径下寻找。所以,PATH环境变量里维护了大量的路径,是搜索命令时的路径。

如果想将我们所写的可执行程序如同系统命令一样执行的方法有:

  1. 将我们可执行程序,拷贝放到PATH环境变量中的任意一个一个路径中。(强烈不推荐!因为拷贝放置这个行为就叫做安装,相当于把我们写的命令安装到系统里了,但是,这样会污染别人写的命令池的)
  2. 将我们当前所写的程序的路径放在PATH环境变量里:

        可以使用pwd命令查看当前可执行程序的位置:博客此处是/home/qcr/linux/test_22_12_4

命令:export PATH=$PATH:/home/qcr/linux/test_22_12_4


将我们当前所写的程序的路径放在PATH环境变量里

which在环境变量PATH中查找命令(可执行程序)的所处路径

        不用担心,一般命令行上更改环境变量,只会在本次对话当中、本次登陆当中时被修改,当退出此次登录后就无效了。所有的环境变量实际上都是在系统的配置文件上保存着的,所以当启动之前自己改动过配置文件,就会影响,而且影响很大,如果不改配置文件,就在命令行上,就可以谁便乱搞了。

常见环境变量

  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • SHELL : 当前Shell,它的值通常是/bin/bash。

(看Linux中所有的环境变量)

        使用命令env(environment的缩写)。

命令:env


打印当前bash的全部环境变量。

HOME

         当前用户的家目录会保存在里面。

命令:echo &HOME


取出并在命令行上打印HOME中保存的当前用户的家目录。

和环境变量相关的命令

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量

通过代码如何获取环境变量

命令行main函数第三个参数

       #问:main函数可以带参数吗?如果可以,那main函数最多可以带几个参数?(main函数有三个参数)

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

环境变量参数

        其是每一个在进程启动的时候,启动该进程的进程传递给它的环境变量信息,都可以以该参数传导进来。而环境变量参数的类型为指针数组,所以实际上的结构为: 

         数组内是char*类型的, 保存的是环境变量字符串。以此形式一个个的维护起来。然后再把这个数组整体作为一个参数传递给我们所对应的main函数。

我们可以尝试将其打印出来:

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

通过第三方变量environ获取

        通过代码如何获取环境变量,除上述main函数中利用env[]查看环境变量外,还可以利用通过第三方变量environ获取。

man environ

#include <stdio.h>
int main(int argc, char *argv[])
{
    extern char **environ; //声明一下,申明environ这个环境变量是系统给的
    printf("begin.....................\n");
    for(int i = 0; environ[i]; i++){
        printf("%s\n", environ[i]);
    }
    printf("end.......................\n");
    
    return 0;
}

        就相当于C语言提供的全局变量,但刚启动的时候该指针就会被指向环境变量表,以通过此方式获取。

注:前两种获取方式main与environ,几乎是都不会用的,因为最致命的缺陷就是将环境变量当字符串了。所以后买你提取并使用哪个环境变量还需要自己分析。

通过getenv函数来特定访问获取

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

通过setenv函数来特定访问获取

man setenv


        我们之所以能使用一些方法获取变量,是因为是有导入,导入是由父进程导入的,是通过由父进程那里继承得来的,父进程又由它的父进程继承过来的,所以一定会有最开始,命令行写shell的时候是从bash作为开始的。

        因为在命令行上运行命令,包括自己执行自己的程序,所有的最初父进程都是当前bash:

验证是bash作为最开始向下导入的环境变量:

  • 向bash中导入一个不存在的环境变量:

命令:exprort hello=你好


在当前bash,增加一个名为hello内容为你好的环境变量。

命令:env


打印当前bash的全部环境变量,通过加入管道可以针对性的查找环境变量。

  • bash向下导入了:
int main()
{
    printf("%s\n", getenv("hello"));
    return 0;
}

        所以我们在bash当中,可以通过向bash当中导入环境变量,这样所有的子进程就会继承环境变量。而bash有它的子进程,而子进程又有着自己的子进程,如果不更改默认参数,那么环境变量就会像一颗树一样传递下去。所以环境变量具有全局属性

        环境变量具有全局属性的本质:可以被所有子进程继承下去,所有进程都可以拿到环境变量。

Note:

        命令:hello=你好

        此时的hello不是环境变量,而是局部变量。


在命令行我们可以定义两种变量:

  1. 环境变量(全局变量)
  2. 局部变量(普通变量)。

        这个时候需要通过命令:set(打印当前bash的所有变量),然后加上管道查询变为命令:set | grep hello才能查到局部变量hello。

        如果在执行文件中使用getenv函数查询hello,是会出现段错误,局部变量(普通变量)是不会被子进程继承下去,这就是局部变量(普通变量)与环境变量(全局变量)的区别

命令行main函数第一、二个参数

        argc是命令行参数的个数,argv[]是存储命令行参数的char*类型的指针数组。

        命令行参数就是,对于执行的时候传入的选项,看作字符串,将其用指针数组存起来。

#问:那为什么要有这两个参数?有什么意义?

        答:这两个参数,就是我们日常使用的命令行命令,之所以带上选项就不同的原因。(如:ls的ls -a、ls -a -l),通过此实现同一个程序的不同功能选项的含义。换而言之命令行参数也是父进程。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用R语言理解洛必达法则

文章目录5 洛必达法则极限的种类洛必达法则作用于幂函数5 洛必达法则 极限的种类 令NNN为常数&#xff0c;则常规的极限运算大致有以下几种 ∞N∞∞⋇N∞(N̸0)N∔∞∞N−∞−∞N/∞0N/0∞N∞∞(N̸1)∞N∞(N̸0)\begin{matrix} &\infty\pm N\infty\quad&\infty\divi…

MySQL版本由5.7.37更新到5.7.39

一、前景 由于mysql5.7.37存在漏洞&#xff0c;影响系统安全&#xff0c;所以需要将mysql版本升级到5.7的最新版本5.7.39。 二、步骤 1、下载5.7.39的安装包&#xff1a; 下载链接如下&#xff1a; https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.39-1.el…

node基础知识

node基础知识 node在真实项目中的应用 webpack基于node环境 用nodejs的语法合并压缩打包 js放到客户端浏览器中执行 放到服务器端运行&#xff1a;java因为jdk php因为tomcat c#因为有.net framework 项目架构1&#xff1a;中小型项目-基于nodejs构建全栈 项目架构2&#xff1a…

mysql转DM达梦数据库+springboot兼容DM数据库+springboot兼容activity5.22.0

由于现在做的项目中需要针对数据库进行国产化操作&#xff0c;最终完成从mysql到达梦的迁移&#xff0c;记录整合迁移记录如下&#xff1a;安装初始化达梦数据库&#xff08;傻瓜式安装即可&#xff09;安装达梦数据库&#xff08;windows、linux&#xff09;初始化数据库实例关…

代码质量与安全 | 新时代:2023年商业软件开发的五大关键目标

进入2023年&#xff0c;技术趋势仍然聚焦于人工智能、边缘智能和气候变化领域&#xff0c;但供应链增速放缓和日益增长的消费者需求阻碍着创新的步伐。为了在行业中保持竞争力&#xff0c;并实现软件工程预定目标&#xff0c;软件开发领导者需要主动制定预算和时间管理计划&…

Java设计模式-模板模式Template

介绍 模板方法模式&#xff08;Template Method Pattern&#xff09;&#xff0c;又叫模板模式(Template Pattern)&#xff0c;z 在一个抽象类公开定义了执行。它的方法的模板。它的子类可以按需要重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。简单说&#xff…

中移链合约常用开发介绍 (二)多索引表的使用

一、目的本文详细介绍了开发、部署和测试一个地址簿的智能合约的流程&#xff0c;适用于EOS的初学者了解如何使用智能合约实现本地区块链上数据的持久化和对持久化数据的增删改查。二、智能合约介绍区块链作为一种分布式可信计算平台&#xff0c;去中心化是其最本质的特征。每笔…

17.Isaac教程--机器学习流程

机器学习流程 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录机器学习流程模拟训练PC 和边缘设备上的推理使用 TensorRT 进行推理Torch推理使用 Tensorflow 进行推理示例PyCodelet配套代码Tensorflow 推理小码TensorRT 推理小码SampleAc…

23种设计模式(三)——模板方法模式【组件协作】

文章目录意图什么时候使用模板方法真实世界类比常说的钩子模板方法的实现模板方法模式的优缺点亦称&#xff1a; Template Method 意图 它的主要思想是&#xff0c;定义一个操作的一系列步骤&#xff0c;对于某些暂时确定不下来的步骤&#xff0c;就留给子类去实现好了&#x…

位图与矢量图的区别

相信大家在日常的工作过程中&#xff0c;经常会听到位图和矢量图&#xff0c;那么位图和矢量图的区别是什么呢&#xff1f; 1.定义 ①位图&#xff1a;称为点阵图像或栅格图像&#xff0c;是由称作像素&#xff08;图片元素&#xff09;的单个点组成的。这 些点可以进行不同的排…

测试用例设计方法有哪些?举例说明

众所周知&#xff0c;测试用例是编制的一组测试输入、执行条件及预期结果&#xff0c;专门为的是某个特殊目标&#xff0c;即测试某个程序路径&#xff0c;或是核实是否满足某个特定的需求。一般来讲&#xff0c;常用的测试用例设计方法有五种&#xff0c;分别是&#xff1a;正…

微信小程序中如何实现双向绑定

一、双向绑定 在微信小程序中如何实现双向绑定&#xff1f;在开始之前先介绍下什么是双向绑定&#xff0c;js中定义变量数据后&#xff0c;通过{{}}绑定到模板中&#xff0c;这个过程是单向绑定&#xff0c;即数据的更新只能是js中更新了数据&#xff0c;模板中跟着修改。但是如…

深度学习笔记:神经网络(3)

关于本章之前内容可以参考以下之前文章&#xff1a; 1 https://blog.csdn.net/Raine_Yang/article/details/128473486?spm1001.2014.3001.5501 2 https://blog.csdn.net/Raine_Yang/article/details/128584916?spm1001.2014.3001.5501 神经网络的输出层设计 机器学习问题一般…

2022年12月青少年软件编程(Python) 等级考试试卷(三级)

2022. 12 青少年软件编程&#xff08;Python&#xff09; 等级考试试卷&#xff08;三级&#xff09; 一、 单选题(共 25 题&#xff0c; 共 50 分) 1.列表 L1 中全是整数&#xff0c; 小明想将其中所有奇数都增加 1&#xff0c; 偶数不变&#xff0c; 于是编写了如下图 所示的…

高级树结构之平衡二叉树(ALV树)

文章目录平衡二叉树简介失衡类型&处理办法RR型失衡【左旋调整】调整演示代码实现LL型失衡【右旋调整】调整演示代码实现RL型失衡【先右旋后左旋调整】调整演示代码实现LR型失衡【先右旋后左旋调整】调整演示代码实现插入操作综合代码演示平衡二叉树简介 在数据有序的情况下…

Codeforces Round #842 (Div. 2)

Codeforces Round #843 (Div. 2) 传送门 不想搞的很累&#xff0c;对自己不做要求&#xff0c;有兴趣就做。 A. Greatest Convex #include <bits/stdc.h>using namespace std; const int maxn 1e6 10; vector<int> cnt[maxn]; map<int, int> mp;int mai…

nvm安装 疑难问题解决

nvm介绍 NVM是node.js的版本管理器&#xff0c;设计为每个用户安装&#xff0c;并在每个shell中调用。nvm可以在任何兼容posix的shell (sh、dash、ksh、zsh、bash)上运行&#xff0c;特别是在这些平台上:unix、macOS和windows WSL。 nvm安装 &#xff01;&#xff01;重要&a…

强化学习在智能补货场景的应用

本文作者&#xff1a;应如是&#xff0c;观远算法团队工程师&#xff0c;毕业于伦敦帝国理工学院计算机系&#xff0c;主要研究方向为强化学习、时间序列算法及其落地应用。深耕零售消费品场景&#xff0c;解决供应链运筹优化问题。为客户提供基于机器学习的AI解决方案。1. 背景…

2023.Q1 go语言记录

1. Go 语言数组声明和初始化var variable_name [SIZE] variable_type&#xff0c;eg&#xff1a;var balance [10] float32var balance [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}balance : [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}长度不确定的初始化var balance [...]float…

少儿Python每日一题(21):八皇后问题

原题解答 本次的题目如下所示: 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即,…