Linux 环境变量 命令行参数

文章目录

  • 问题引入
  • 环境变量
  • 环境变量相关操纵(附源码)
  • 命令行参数
  • 问题解释

问题引入

Linux下,为什么我们自己写的可执行文件需要写明路径才可以执行,而系统的命令不需要?

如何使自己的命令也可以不带路径执行?

环境变量

Linux环境变量的概念:
Linux环境变量是一种存储在操作系统中的值,用于控制应用程序的行为。环境变量可以在系统启动时设置,也可以在运行时动态设置。环境变量通常用于存储系统级别的配置信息,例如路径、语言、用户名等。在Linux系统中,环境变量以键值对的形式存在,键是变量的名称,值是变量的内容。可以使用命令行工具如export和set来设置和查看环境变量。应用程序可以通过读取环境变量来获取配置信息,从而实现不同的行为。

简易理解
类似于语言学习中的变量 int a = 1 ;a为变量,
1为变量目前所存储的值,在操作系统的学习中,有多种变量,变量的性质不同,功能也不同,变量处处都有,环境变量顾名思义是与程序执行的环境有关,问题引入部分的问题就涉及环境变量的问题。

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

环境变量相关操纵(附源码)

查看环境变量的方法:
方法一、二、三:
在这里插入图片描述
运行结果:在这里插入图片描述

方法四:echo $NAME //NAME:你的环境变量名称。

本地变量与环境变量
在Linux中,本地变量(local variable)和环境变量(environment variable)是两种不同类型的变量,它们具有不同的作用范围和生命周期。

  1. 作用范围:

    • 本地变量:本地变量只在定义它的代码块(如函数或脚本)内部有效。它们对于其他代码块是不可见的。
    • 环境变量:环境变量在整个系统中都是可见的,可以被不同的进程和程序访问和使用。
  2. 生命周期:

    • 本地变量:本地变量的生命周期与它们所在的代码块相关。当代码块执行完毕或变量超出作用范围时,本地变量将被销毁。
    • 环境变量:环境变量的生命周期在整个系统中持久存在,直到显式删除或系统关闭。它们可以在不同的进程和会话中共享和传递值。
  3. 设置和访问:

    • 本地变量:本地变量通常是通过在代码中直接声明和赋值来设置的,并且只能在定义它们的代码块中使用。
    • 环境变量:环境变量可以在shell中使用export命令设置,或者通过在启动脚本(如.bashrc.profile)中定义。其他进程和程序可以通过调用系统函数(如getenv())来访问环境变量的值。
  4. 用途:

    • 本地变量:本地变量通常用于在代码块内部存储临时数据和中间结果,对于其他代码块是不可见的。
    • 环境变量:环境变量用于存储系统级的配置信息、用户首选项、路径等,可以在不同的进程和会话中共享和使用。

总之,本地变量和环境变量在作用范围、生命周期、设置和访问方式以及用途上有所区别。本地变量仅在定义它们的代码块内部有效,用于存储临时数据;而环境变量在整个系统中可见,用于存储系统级配置信息。

env指令
在Linux中,env是一个命令行工具,用于显示当前进程的环境变量或在指定环境下执行给定命令。

env命令的常见用法有两种:

  1. 显示当前进程的环境变量:

    $ env
    

    这会列出当前进程的所有环境变量及其对应的值。输出的格式为key=value形式。

  2. 在指定环境下执行给定命令:

    $ env -i <key1>=<value1> <key2>=<value2> ... <command>
    

    这会在指定的环境变量下执行给定的命令。通过-i选项可以清除当前环境变量,然后通过<key>=<value>的形式设置新的环境变量。最后,<command>表示要执行的命令。

    例如,要在清除环境变量的情况下执行ls命令,可以使用以下命令:

    $ env -i ls
    

    如果要在指定环境变量的情况下执行命令,可以使用以下命令:

    $ env VAR1=value1 VAR2=value2 <command>
    

    例如,要在设置PATH环境变量后执行ls命令,可以使用以下命令:

    $ env PATH=/usr/local/bin ls
    

env命令的主要作用是在不同的环境变量下执行命令,或者查看当前进程的环境变量。它在脚本中常用于控制命令执行的环境,或者作为调试工具来检查环境变量的设置。

可以通过man env命令查看env命令的更多详细信息和选项。
getenv函数
在Linux中,getenv()是一个C语言函数,用于获取指定环境变量的值。

getenv()函数的原型如下:

#include <stdlib.h>char *getenv(const char *name);

该函数接受一个字符串参数name,表示要获取的环境变量的名称。它返回一个指向环境变量值的字符串的指针,如果找不到指定的环境变量,则返回NULL

以下是一个使用getenv()函数的示例:

#include <stdio.h>
#include <stdlib.h>int main() {char *path = getenv("PATH");if (path != NULL) {printf("PATH: %s\n", path);} else {printf("PATH environment variable not found\n");}return 0;
}

在这个示例中,我们使用getenv()函数获取名为PATH的环境变量的值,并将其存储在path指针变量中。然后,我们根据返回值判断是否成功获取了环境变量,并打印出相应的结果。

需要注意的是,getenv()函数返回的字符串指针指向的是环境变量的内部存储空间,因此不应该尝试修改返回的字符串。如果需要修改环境变量的值,应该使用相关的函数,如setenv()putenv()

另外,getenv()函数是标准C库提供的函数,定义在<stdlib.h>头文件中。在使用getenv()函数之前,需要包含该头文件。

临时环境变量创建(生命周期为本次连接Linux)
export 变量名=变量值
本地变量创建(生命周期为本文件内)
变量名=变量值

命令行参数

在这里插入图片描述
argc的含义为 指针数组argv的所含字符串数。
argv 为接受指令选项的指针数组
env 为接受环境变量的指针数组
argv 和 argc 可规范命令格式,可以支持命令有多选项。
上述3个参数均为 bash 辅助传入(先阶段粗略了解)

问题解释

Linux下,为什么我们自己写的可执行文件需要写明路径才可以执行,而系统的命令不需要?
1.子进程在默认情况下会继承父进程环境变量,始源的环境变量来自于bash,bash的环境变量来自于系统文件;
2.我们执行的命令都是进程中执行;
3.例如 PATH HOME 环境变量几乎在每个进程中都有;
4.系统自带的可执行文件通过PATH环境变量,找到文件位置,不需要传入了。

如何使自己的命令也可以不带路径执行?
1 通过给PATH环境变量添加我们自定义文件的路径
2.PATH变量存储多个系统程序自带的路径,多个路径间用“ :“符号隔开,要想添加,需按此格式。
在这里插入图片描述
3.利用set指令 set PATH = PATH + :所设路径 ;
(指令使用错误也不会造成损失,重新连接Linux系统即可,永久更改需在配置文件中操作,但不建议这样做)

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

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

相关文章

SAP-QM质量管理视图字段解析

QM物料授权:如果在物料主记录中输入物料授权组,则系统将检查(在物料基础上)用户是否具有对以上名称对象的授权。如果未输入授权组,则不进行授权检查。要通过授权检查,用户需要 物料授权,其中包含有字段值所表示的相关授权组。 收货处理时间:收货后的加盐时间(天数)如…

基于Servlet+JDBC实现的基础博客系统>>系列3 -- Servlet后端服务器搭建

目录 前言 1. 前期准备 2. Model层 2.1 数据库的设计 2.2 数据库表对应的实体类实现 User类 Blog类 2.3 JDBC 工具类实现 2.4 UserDao 的实现 2.5 BlogDao 的实现 3. Controller 层实现 3.1 博客列表页 3.1.1 约定前后端交互接口 3.1.2 编写后端代码 3.1.3 编写…

Redis复习

文章目录 分布式锁基本概念及问题超时问题可重入锁 Pub/Sub消息多播Pub/Sub模式订阅消息结构PubSub缺陷 线程 I/O模型非阻塞I/O事件轮询&#xff08;多路复用&#xff09;select函数指令队列 分布式锁 基本概念及问题 如果操作要修改用户状态&#xff0c;需要先读取再修改用户…

Nginx | 苹果电脑Mac安装和验证Nginx服务过程记录

common wx&#xff1a;CodingTechWork&#xff0c;一起学习进步。 引言 本文主要总结如何在Mac电脑上进行Nginx服务的安装&#xff0c;重点讲解使用brew命令进行安装和验证的过程及问题记录。 安装步骤 安装过程记录 查看nginx信息 首先使用命令brew info nginx进行本机ng…

Linux下Master-Master Replication Manager for MySQL 双主故障切换

简述&#xff1a; Master-Master Replication Manager for MySQL&#xff08;MMRM&#xff09;是一种用于MySQL数据库的主-主复制管理工具。它允许在多个MySQL主机之间建立双向的主-主复制关系&#xff0c;实现数据的同步和高可用性。 工作原理是通过在每个MySQL主机上配置双…

传统后端漏洞----(Web Server) 解析漏洞

笔记 前言IIS解析漏洞文件夹解析漏洞原理限制条件 ";" 分号截断漏洞原理 IIS解析漏洞检测IIS 文件夹解析漏洞检测IIS 分号截断漏洞检测 防御手段 Nginx解析漏洞Nginx 文件类型错误解析漏洞导致任意PHP代码执行原理Nginx 空字节解析漏洞导致任意文件可解析&#xff08…

【详细分析】thinkphp反序列化漏洞

文章目录 配置xdebug反序列化漏洞利用链详细分析poc1&#xff08;任意文件删除&#xff09;测试pocpoc2&#xff08;任意命令执行&#xff09;poc3&#xff08;任意命令执行&#xff09; 补充代码基础函数trait关键字应用案例优先级多trait 配置xdebug php.ini [Xdebug] zend…

Spring Boot 中的 WebMvc 是什么,原理,如何使用

Spring Boot 中的 WebMvc 是什么&#xff0c;原理&#xff0c;如何使用 介绍 在 Spring Boot 中&#xff0c;WebMvc 是非常重要的一个模块。它提供了一系列用于处理 Web 请求的组件和工具。在本文中&#xff0c;我们将介绍 Spring Boot 中的 WebMvc 是什么&#xff0c;其原理…

“配置DHCP Snooping实验:保护网络中的DHCP服务和防止欺骗攻击“

"配置DHCP Snooping实验&#xff1a;保护网络中的DHCP服务和防止欺骗攻击" 【实验目的】 部署DHCP服务器。熟悉DHCP Snooping的配置方法。验证拓扑。 【实验拓扑】 实验拓扑如图所示。 设备参数如下表所示。 设备 接口 IP地址 子网掩码 默认网关 R1 F0/0 …

vue element UI在button按钮使用 @keyup.enter不生效

如图所示&#xff0c;没效果。在按钮上绑定keyup事件&#xff0c;加上.native覆盖原有封装的keyup事件 解决办法 created () {document.onkeyup e > {if (e.keyCode 13 && e.target.baseURI.match(/login/)) {// 调用登录 验证方法this.submitForm()}}}成功解决&…

MySQL子查询

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;进入MySQL专栏知…

如何使用upupw搭建服务器,并映射外网访问

作为计算机行业从业人员&#xff0c;相信很多人都接触并使用过phpstudy等类似环境集成包&#xff0c;着对于upupw就比较好理解了。UPUPW绿色服务器平台是Windows下很有特色的一款免费服务器PHP套件&#xff0c;UPUPW PHP套件简化了PHP环境搭建步骤&#xff0c;一个压缩包解压到…