【linux】环境变量(详解)

【linux】环境变量(详解)

目录

一、命令行参数

1. 什么是命令行参数?

2. main函数有参数吗?

二、环境变量

1. 什么是环境变量?

2. 环境变量的分类

3. 环境变量——PATH

补充:环境变量是怎么来的?

4. 怎么查看环境变量

4.1、查看指定环境变量——echo $NAME

4.2、env——显示所有环境变量

4.3、set——显示shell变量和环境变量

4.4、通过main函数第三个参数——env

4.5、通过第三方变量environ获取

补充:环境变量如何被组织?

4.6、通过系统调用获取或设置环境变量

5、认识更多环境变量

6、添加和删除环境变量

1. 添加环境变量

2. 删除环境变量

7. 环境变量的继承性和全局属性

补充:内建命令和常规命令


一、命令行参数

1. 什么是命令行参数?

当我们登录Linux,输入的指令后跟着的相关的选项就是命令行参数。

2. main函数有参数吗?

我们平时可能都没有注意到,其实main函数也有自己的参数。



argc:代表参数的个数;

argv:字符指针数组,命令行被分开存储在数组中;

env:字符指针数字,存储环境变量。

下面我们通过一段代码来验证一下:







./test 运行上面的代码,其实就是一句指令,main在其参数中其实记录了我们输入的指令和选项。

💡那这有什么用呢?

当我们带上选项去执行 test 程序时,就可以通过选项完成指定的任务:

二、环境变量

1. 什么是环境变量?

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

我们写的C/C++代码在链接动态库时,我们并不知道库在哪里,但是我们却可以链接成功,就是因为有环境变量帮编译器查找。

2. 环境变量的分类

Linux系统中的环境变量根据生命周期分为:

(1)永久的:根据系统的配置文件生成的,永久生效。

(2)临时的:用户利用export命令,在当前终端下声明环境变量,关闭Shell终端失效。

根据作用域分为:

(1)系统环境变量:对该系统中所有用户都有效。

(2)用户环境变量:只对特定的用户起作用。

3. 环境变量——PATH

当我们要执行一个程序或者一个指令,就要去找对应的二进制文件。

💦 怎么找?

环境变量——PATH帮助Shell(命令解释器,如 bash)去找二进制文件。

比如当我们执行: ls -a -l 指令,Shell 本身不知道 ls 存放在哪个目录,会按顺序遍历 PATH 环境变量中所有以冒号分隔的目录去找对应的文件

💦 怎么查看PATH这个环境变量?

echo $PATH
🌈一个有趣的现象:

当我们执行系统指令的时候,如ls,pwd时,只需要输入指令即可;当我们要执行我们自己的程序,如 test,就需要带上 ./test(. 代表当前工作路径,/ 路径分隔符)。

💦 这是为什么?

因为对应系统命令,可以通过PATH环境变量来帮助 shell 找到 ls 和 pwd 对应的文件(即shell遍历环境变量),而在echo $PATH打印出的路径没有我们可执行程序的文件,所以shell找不到,就需要我们带上我们程序的路径。

💡有没有办法让我们直接通过 test,就可以执行我们的执行?

其实 test 也是指令,所以我们如果将test 对应文件的路径添加到PATH 默认的路径后面,不就可以直接执行了。

添加路径到PATH中有两种方式: 

(1)PATH=相关路径 :就会覆盖系统默认的PATH的内容。





(2)PATH=$PATH:相关路径,这种方式相当于把你要添加的路径拼接到了PATH原来的路径后面。





注意:以上两种方式其实并不会改变PATH默认的内容,当我们退出再次登陆后,PATH又会恢复到原来的样子。
补充:环境变量是怎么来的?

在家目录中有两个配置文件:.bash_profile 和 .bashrc,当bash进程启动(登录 Shell 加载 .bash_profile,交互式非登录 Shell 加载 .bashrc),就会根据配置文件生成环境变量表。 

4. 怎么查看环境变量

4.1、查看指定环境变量——echo $NAME

NAME即环境变量名,上面已经演示过了。

4.2、env——显示所有环境变量
env
4.3、set——显示shell变量和环境变量
set
4.4、通过main函数第三个参数——env

上面我们在介绍命令行参数时,提到main函数其实有三个参数,而第三个就是环境变量数组。

下面我们就来实际验证一下:

#include <stdio.h> int main(int argc, char *argv[], char *env[]) { for(int i = 0; env[i]; i++) { printf("%s\n", env[i]); } return 0; } 
4.5、通过第三方变量environ获取

是 Linux系统中 C 语言的全局变量,用于直接访问进程的所有环境变量。

变量类型:

extern char **environ;
#include<stdio.h> int main() { extern char **environ; for(int i = 0; environ[i]; i++) printf("%s\n", environ[i]); return 0; } 
补充:环境变量如何被组织?
4.6、通过系统调用获取或设置环境变量

•putenv , 后面讲解

• getenv , 本次讲解

#include<stdlib.h> int main() { char *r1 = getenv("PATH"); char *r2 = getenv("USER"); printf("%s\n", r1); printf("%s\n", r2); return 0; } 

5、认识更多环境变量

# 1. 添加普通环境变量(如 MY_VAR=值) export MY_VAR="hello" # 2. 添加路径到 PATH(比如把你的 test 目录加入 PATH) export PATH=$PATH:/home/hds/code/lesson13

1. HOSTNAME:指主机的名称。

2. SHELL:bash所在的路径。

3. HISTSIZE:记录历史命令的条数,这就是为什么我们能够查找历史命令的原因。

4. USER:创建bash 的用户。

5. PWD:当前的工作路径。

6. OLDPWD:最近切换的一次路径。

7. MAIL:当前用户的邮件存放目录。

8. HOME:代表家目录。

6、添加和删除环境变量

1. 添加环境变量

1.1、临时添加(仅当前终端生效,重启 / 新开终端失效)

所有 Shell 通用,直接在终端执行 export 命令即可:

# 1. 添加普通环境变量(如 MY_VAR=值) export MY_VAR="hello" # 2. 添加路径到 PATH(比如把你的 test 目录加入 PATH) export PATH=$PATH:/home/hds/code/lesson13

1.2、永久添加(重启终端仍生效)

需编辑对应 Shell 的配置文件:当前用户(bash Shell,绝大多数 Linux 默认)

// 步骤一:打开配置文件 # 编辑 ~/.bashrc(交互式终端默认加载,最常用) vim ~/.bashrc // 步骤二: # 示例1:添加普通环境变量 export MY_VAR="hello" # 示例2:添加你的 test 目录到 PATH export PATH=$PATH:/home/hds/code/lesson13 // 步骤三:让配置生效 source ~/.bashrc

2. 删除环境变量
// NAME 代表环境变量名 unset NAME

对于 PATH 环境变量,注意:如果unset PATH,就会将所有内容删除。

# 步骤1:查看当前 PATH(复制输出内容,备用) echo $PATH # 输出示例:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/bin:/home/hds/code/lesson13 # 步骤2:重新赋值 PATH,去掉目标目录(仅保留其他部分) export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/bin # 步骤3:验证:PATH 中已无 /home/hds/code/lesson13 echo $PATH

7. 环境变量的继承性和全局属性

环境变量通常具有全局属性,可以被子进程继承下去。

继承:子进程会复制父进程的环境变量表作为自己的初始环境变量,这是环境变量传递的唯一方式。

在bash进程创建环境变量:export MY_ENV="hello Linux"

#include<stdio.h> #include<unistd.h> #include<sys/types.h> int main() { printf("%s\n", getenv("MY_ENV")); pid_t id = fork(); if(id == 0) { // 子进程 printf("我是子进程:%s\n", getenv("MY_ENV")); } return 0; } 
(1)子进程对环境变量的修改不影响父进程(写时拷贝)。

(2)本地变量无法被子进程继承:

补充:内建命令和常规命令
1. 常规命令

常规命令的执行,是通过创建子进程来完成的—— 这些命令是独立的程序,Bash 会启动一个新的子进程,让子进程去运行这个程序,程序跑完子进程就结束。

2. 内建命令

内建命令的执行,Bash 不会创建子进程,而是由 Bash 自己直接执行 —— 相当于 Bash 调用了自己内置的功能(类似 Bash 自己写好的函数),不用额外开新进程。

内建命令:

• 执行效率更高

无需创建子进程,直接由 Shell 执行,比如 cd/export 这类高频命令,内建实现能大幅提升效率。

• 能修改 Shell 自身的环境

外部命令运行在子进程中,修改的环境变量无法影响父 Shell;但内建命令直接在 Shell 进程中执行,可修改 Shell 的环境。

             😄 创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看😘

Read more

MCP客户端与服务端初使用——让deepseek调用查询天气的mcp来查询天气

MCP客户端与服务端初使用——让deepseek调用查询天气的mcp来查询天气

本系列主要通过调用天气的mcp server查询天气这个例子来学习什么是mcp,以及怎么设计mcp。话不多说,我们开始吧。主要参考的是B站的老哥做的一个教程,我把链接放到这里,大家如果有什么不懂的也可以去看一下。 https://www.bilibili.com/video/BV1NLXCYTEbj?spm_id_from=333.788.videopod.episodes&vd_source=32148098d54c83926572ec0bab6a3b1d https://blog.ZEEKLOG.net/fufan_LLM/article/details/146377471 最终的效果:让deepseek-v3使用天气查询的工具来查询指定地方的天气情况 技术介绍 MCP,即Model Context Protocol(模型上下文协议),是由Claude的母公司Anthropic在2024年底推出的一项创新技术协议。在它刚问世时,并未引起太多关注,反响较为平淡。然而,随着今年智能体Agent领域的迅猛发展,MCP逐渐进入大众视野并受到广泛关注。今年2月,

By Ne0inhk
可以在命令行通过大模型使用上下文协议(MCP)与外部工具交互的软件:小巧的MCPHost

可以在命令行通过大模型使用上下文协议(MCP)与外部工具交互的软件:小巧的MCPHost

小巧的MCPHost MCPHost 可以在命令行下使用,使大型语言模型(LLM)能够通过模型上下文协议(MCP)与外部工具进行交互。目前支持Claude 3.5 Sonnet和Ollama等。本次实践使用自己架设的Deepseek v3模型,跑通了Time MCP服务。  官网:GitHub - mark3labs/mcphost: A CLI host application that enables Large Language Models (LLMs) to interact with external tools through the Model Context Protocol (MCP). 下载安装 使用非常方便,直接下载解压即可使用。官网提供Windows、Linux和MacOS三个系统的压缩包: https://github.com/

By Ne0inhk
实战篇:Python开发monogod数据库mcp server看完你就会了

实战篇:Python开发monogod数据库mcp server看完你就会了

原创不易,请关注公众号:【爬虫与大模型开发】,大模型的应用开发之路,整理了大模型在现在的企业级应用的实操及大家需要注意的一些AI开发的知识点!持续输出爬虫与大模型的相关文章。 前言 目前mcp协议是给deepseek大模型插上工具链的翅膀,让大模型不仅拥有超高的推理和文本生成能力,还能具备执行大脑意识的工具能力! 如何开发一个mcp? mcp是一种协议,指的是模型上下文协议 (Model Context Protocol)。 官方结成的mcp https://github.com/modelcontextprotocol/python-sdk mcp库 pip install mcp from mcp.server.fastmcp import FastMCP 我们先来做一个简单的案例 from mcp.server.fastmcp import FastMCP import requests mcp = FastMCP("spider") @mcp.tool() def crawl(

By Ne0inhk
AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建

AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建

AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建 作者:高瑞冬 本文目录 * AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建 * 一、MCP协议简介 * 二、创建MCP工具集 * 1. 获取MCP服务地址 * 2. 在FastGPT中创建MCP工具集 * 三、测试MCP工具 * 四、AI模型调用MCP工具 * 1. 调用单个工具 * 2. 调用整个工具集 * 五、私有化部署支持 * 1. 环境准备 * 2. 修改docker-compose.yml文件 * 3. 修改FastGPT配置 * 4. 重启服务 * 六、使用MCP-Proxy集成多个MCP服务 * 1. MCP-Proxy简介 * 2. 安装MCP-Proxy * 3. 配置MCP-Proxy * 4. 将MCP-Proxy与FastGPT集成 * 5. 高级配置

By Ne0inhk