当前位置: 首页 > article >正文

Linux--命令行参数和环境变量

1.命令行参数

Linux 命令行参数基础

1.1参数格式

位置参数:无符号,按顺序传递(如 ls /home/user 中 /home/user 是位置参数)

选项参数

短选项:以 - 开头,单个字母(如 -l 表示长格式,-a 显示隐藏文件)。

长选项:以 -- 开头,完整单词(如 --version 显示版本,--help 查看帮助)

1.2 常用命令示例

# 查看文件内容(带行号)
cat -n file.txt  # 复制文件并显示过程(-v 是 verbose 标志)
cp -v source.txt target.txt  # 压缩目录(-c 新建压缩包,-z gzip 压缩,-f 指定文件名)
tar -czf archive.tar.gz directory/ 

1.3 C 语言中获取命令行参数

在 C 语言中,通过 main 函数的参数 argc(参数个数)和 argv(参数数组)获取命令行参数:

#include <stdio.h>int main(int argc, char *argv[]) {// argc:参数总数(包含程序名本身,至少为 1)// argv:指针数组,argv[0] 是程序名,argv[1]~argv[argc-1] 是参数printf("程序名:%s\n", argv[0]);printf("参数个数:%d\n", argc - 1); // 除去程序名的参数个数// 遍历所有参数(从第 1 个开始)for (int i = 1; i < argc; i++) {printf("参数 %d:%s\n", i, argv[i]);}return 0;
}
编译与运行
# 编译
gcc main.c -o cmd_args# 运行并传递参数
./cmd_args hello -l --test "带空格的参数"

输出结果:

程序名:./cmd_args
参数个数:4
参数 1:hello
参数 2:-l
参数 3:--test
参数 4:带空格的参数

实际上,我们输入的指令实际就是字符串,bash进程拿到之后会根据要求打断,拿到不同的小串,再做分支去执行命令。

以上是示例,总结下来这里有三个需要注意的点:

1.命令行参数至少要有一个。

2.进程对应的程序的名字一般是argv[0]。

3.有几个子串,argc就是几。

2.环境变量

2.1基本概念

环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪
⾥,但是照样可以链接成功,⽣成可执⾏程序,原因就是有相关环境变量帮助编译器进⾏查找。
环境变量通常具有某些特殊⽤途,还有在系统当中通常具有全局特性
简单来说,环境变量就是系统级别的全局变量,具有不同的用途

2.2常见环境变量

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

2.3查看环境变量方法

echo $NAME //NAME:你的环境变量名称

2.3.1 PATH

在我们执行一个自己的程序的时候为什么要用“./XXX”,而像ls,cd这些就不用?

系统中那些可直接执行的指令,Linux 下的lscp等,它们所在的目录被预先配置在了系统的PATH环境变量中。当用户在命令行输入这些指令时,操作系统会按照PATH环境变量中列出的目录顺序,依次查找是否存在与输入指令同名的可执行文件。由于这些指令的目录已经在PATH中,所以操作系统能够找到并执行它们,而无需用户输入完整路径。

在 Linux 下,PATH是一个重要的环境变量。它包含了一系列目录路径,用冒号分隔。当执行命令时,系统会按顺序在这些目录中查找对应的可执行文件,以便用户能方便地执行各种命令而无需输入完整路径。

当我们吧PATH赋值为空的时候,系统指令会失效,但是echo命令还是可以正常运行,为什么呢?

知道的小伙伴可以在评论区说说哦!!!

2.3.2 HOME

(1)⽤root和普通⽤⼾,分别执⾏ echo $HOME ,对⽐差异

  • root 用户:执行 echo $HOME 会输出 /root,这是 root 用户的主目录路径。
  • 普通用户:假设普通用户名为 user1,执行 echo $HOME 会输出 /home/user1,即普通用户的主目录路径。

差异原因:每个用户的 HOME 环境变量默认指向其主目录,root 和普通用户的主目录路径不同,因此输出不同

(2)执⾏ cd ~; pwd ,对应 ~ 和 HOME 的关系
  • ~(波浪号)是一个 Shell 语法,表示当前用户的主目录。
  • $HOME 是一个环境变量,存储了当前用户主目录的路径。

执行 cd ~; pwd 时:

  1. cd ~ 会切换到当前用户的主目录,等价于 cd $HOME
  2. pwd 显示当前工作目录,输出结果与 echo $HOME 一致。

关系~ 是 $HOME 的语法简写,两者均指向当前用户的主目录。

2.4和环境变量相关的命令

1. echo: 显⽰某个环境变量值
echo $PATH

输出当前系统的 PATH 环境变量,显示可执行文件的搜索路径

2. export: 设置⼀个新的环境变量
export MY_VAR="hello world"

设置一个名为 MY_VAR 的环境变量,值为 "hello world",仅在当前 shell 会话有效。

3. env: 显⽰所有环境变量
env | less

列出当前所有环境变量,使用less分页查看完整内容。

4. unset: 清除环境变量
unset MY_VAR

删除之前设置的 MY_VAR 环境变量,之后echo $MY_VAR将无输出

5. set: 显⽰本地定义的shell变量和环境变量
set | grep USER

列出所有本地变量和环境变量,并筛选出包含 "USER" 的条目,显示当前用户名相关变量。

2.5 环境变量的组织方式

每个程序都会收到⼀张环境表,环境表是⼀个字符指针数组,每个指针指向⼀个以’\0’结尾的环境
字符串。

2.6 获取环境变量

这里呢我向小伙伴们提供三个方法。
1.main函数参数获取
int main(int argc, char *argv[], char *env[])

这里获取的是整个环境变量的字符串。

2.通过函数获取单个环境变量

char* getenv(const char * name)

这里参数传环境变量的名字,返回环境变量对应的内容。

3.通过第三方变量environ获取

#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;
}

效果是和上面一样的。libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头⽂件中,所以在使⽤时 要⽤ extern声明。

2.7 环境变量通常是具有全局属性的

我们知道,我们所开始的进程都是bash的子进程或者“孙子”进程。

这里我们提几个疑问。

那么当我们做一下操作时:

#include <stdio.h>
#include <stdlib.h>
int main()
{char *env = getenv("MYENV");if(env){printf("%s\n", env);}return 0;
}

运行起来发现什么都没有,说明这个环境变量不存在嘛。

回到命令行输入:

export MYENV="hello world"

再次运行程序发现就有了。

(1)所以为什么呢?

环境变量通常具有全局属性,可以被⼦进程继承下去
(2)我的进程是怎么获得环境变量的呢?
其实不是你的进程获得了环境变量,而是父进程bash获得了环境变量,形成了环境变量表。
bash:两张表{命令行参数表(变化)    环境变量表(稳定)}(从系统配置中获得)
(3)所有环境变量都是一开机就是从配置文件中获取的吗?
但是并不是所有环境变量都是一开机就是从配置文件中获取的,少部分是启动之后动态获取或创建的。
比如:pwd,进程会记录自己的工作路径->cwd父进程的cwd在bash进程自己的task_struct中->创建子进程,以父进程task_struct为模板创建。
(4)如果不用export会怎么样
不用的话子进程就无法进程,因为如果不用的话就不是环境变量而是本地变量, 本地变量不会被子进程继承。

相关文章:

Linux--命令行参数和环境变量

1.命令行参数 Linux 命令行参数基础 1.1参数格式 位置参数&#xff1a;无符号&#xff0c;按顺序传递&#xff08;如 ls /home/user 中 /home/user 是位置参数&#xff09; 选项参数&#xff1a; 短选项&#xff1a;以 - 开头&#xff0c;单个字母&#xff08;如 -l 表示长格…...

Android 集成 Firebase 指南

Firebase 是 Google 提供的一套移动开发平台&#xff0c;包含分析、认证、数据库、消息推送等多种服务。以下是在 Android 应用中集成 Firebase 的详细步骤&#xff1a; 1. 准备工作 安装 Android Studio - 确保使用最新版本 创建或打开 Android 项目 - 项目需要配置正确的包…...

springboot线上教学平台

摘要&#xff1a;在社会快速发展的影响下&#xff0c;使线上教学平台的管理和运营比过去十年更加理性化。依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上线上教学平台系统是一项十分重要并且有价值的事情。对于传统的线上教学平台控制模型来说&#xff0c;网上线上…...

阿里云 Linux 搭建邮件系统全流程及常见问题解决

阿里云 Linux 搭建 [conkl.com]邮件系统全流程及常见问题解决 目录 阿里云 Linux 搭建 [conkl.com]邮件系统全流程及常见问题解决一、前期准备&#xff08;关键配置需重点检查&#xff09;1.1 服务器与域名准备1.2 系统初始化&#xff08;必做操作&#xff09; 二、核心组件安装…...

【Elasticsearch】映射:fielddata 详解

映射&#xff1a;fielddata 详解 1.fielddata 是什么2.fielddata 的工作原理3.主要用法3.1 启用 fielddata&#xff08;通常在 text 字段上&#xff09;3.2 监控 fielddata 使用情况3.3 清除 fielddata 缓存 4.使用场景示例示例 1&#xff1a;对 text 字段进行聚合示例 2&#…...

用Python训练自动驾驶神经网络:从零开始驾驭未来之路

用Python训练自动驾驶神经网络:从零开始驾驭未来之路 哈喽,朋友们!我是Echo_Wish,今天咱们聊点超酷的话题——自动驾驶中的神经网络训练,用Python怎么玩转起来? 说实话,自动驾驶一直是科技圈的香饽饽,为什么?因为它承载了未来交通的无限可能:减少事故、提升效率、节…...

【电路】阻抗匹配

&#x1f4dd; 阻抗匹配 一、什么是阻抗匹配&#xff1f; 阻抗匹配&#xff08;Impedance Matching&#xff09;是指在电子系统中&#xff0c;为了实现最大功率传输或最小信号反射&#xff0c;使信号源、传输线与负载之间的阻抗达到一种“匹配”状态的技术。 研究对象&#x…...

mariadb5.5.56在centos7.6环境安装

mariadb5.5.56在centos7.6环境安装 1 下载安装包 https://mariadb.org/mariadb/all-releases/#5-5 2 上传安装包的服务器 mariadb-5.5.56-linux-systemd-x86_64.tar.gz 3 解压安装包 tar -zxvf mariadb-5.5.56-linux-systemd-x86_64.tar.gz mv mariadb-5.5.56-linux-syst…...

MySQL 索引失效:六大场景与原理剖析

我们都熟知索引是优化 MySQL 查询性能的利器。但你是否遇到过这样的困境&#xff1a;明明在表上建立了索引&#xff0c;查询却依然缓慢&#xff0c;EXPLAIN 分析后发现索引并未被使用&#xff1f;这就是所谓的“索引失效”。 索引失效并非一个 Bug&#xff0c;而是 MySQL 查询…...

打造你的 Android 图像编辑器:深入解析 PhotoEditor 开源库

&#x1f4f8; 什么是 PhotoEditor&#xff1f; PhotoEditor 是一个专为 Android 平台设计的开源图像编辑库&#xff0c;旨在为开发者提供简单易用的图像编辑功能。它支持绘图、添加文本、应用滤镜、插入表情符号和贴纸等功能&#xff0c;类似于 Instagram 的编辑体验。该库采…...

DeepSeek 终章:破局之路,未来已来

目录 一、DeepSeek 技术发展现状回顾二、未来发展趋势2.1 多模态融合的拓展2.2 模型可解释性的强化2.3 垂直领域的深化应用 三、面临的技术挑战3.1 数据隐私与安全难题3.2 算法偏见与公平性困境3.3 网络攻击与恶意利用威胁 四、挑战应对策略探讨4.1 技术层面的解决方案4.2 算法…...

八:操作系统设备管理之缓冲、缓存与假脱机

弥合鸿沟&#xff1a;操作系统中的缓冲、缓存与假脱机技术深度解析 在计算机系统的世界里&#xff0c;存在着一个根本性的速度差异&#xff1a;中央处理器&#xff08;CPU&#xff09;的执行速度飞快&#xff0c;而输入/输出&#xff08;I/O&#xff09;设备&#xff08;如硬盘…...

Azure 虚拟机端口资源:专用 IP 和公共 IP Azure Machine Learning 计算实例BUG

## 报错无解 找不到Azure ML 计算实例关联的 NSG .env 文件和 ufw status&#xff1a; .env 文件中 EXPOSE_NGINX_PORT8080 是正确的&#xff0c;它告诉 docker-compose.yaml 将 Nginx 暴露在宿主机的 8080 端口。 sudo ufw status 显示 Status: inactive&#xff0c;意味着宿…...

Java核心技术-卷I-读书笔记(第十二版)

第一章 Java程序设计概述 09年sun被oracle收购->11年java7&#xff08;简单改进&#xff09;->14年java8&#xff08;函数式编程&#xff09;->2017年java9->2018年java11->2021年java17 第二章 Java编程环境 Java9后新增JShell&#xff0c;提供类似脚本试执…...

从C到C++语法过度1

从C到C语法过度1 文章目录 从C到C语法过度11. 字符串string2. 引用3. 类型转换3.1 新式转换 const_cast3.2 新式转换 static_cast 4. 关键字auto 1. 字符串string C语言从本质上来说&#xff0c;是没有字符串这种类型的&#xff0c;在C语言中如果要表达字符串&#xff0c;只能…...

AI是如何换装的?

AI换装是一种基于计算机视觉、深度学习和生成对抗网络(GAN)的技术,能够通过算法自动识别人像并更换服饰,实现虚拟换装的效果。这项技术广泛应用于电商服装试穿、虚拟偶像、影视特效、社交媒体滤镜等领域。 AI换装的核心技术 1. 图像分割与人体解析 换装的第一步是图像分…...

MATLAB遍历生成20到1000个节点的无线通信网络拓扑推理数据

功能&#xff1a; 遍历生成20到1000个节点的无线通信网络拓扑推理数据&#xff0c;包括网络拓扑和每个节点发射的电磁信号&#xff0c;采样率1MHz/3000&#xff0c;信号时长5.7s&#xff0c;单帧数据波形为实采 数据生成效果&#xff1a; 拓扑及空间位置&#xff1a; 节点电磁…...

python爬虫:grequests的详细使用(基于gevent和requests的异步HTTP请求库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、grequests 概述1.1 grequests 介绍1.2 注意事项1.3 替代方案比较1.4 基本组件1.5 grequests 安装二、基本用法2.1 创建请求任务2.2 发送请求并获取响应2.3 带参数的请求三、高级用法3.1 自定义回调函数3.2 设置超时…...

如何排查和解决PHP连接数据库MYSQL失败写锁的问题

在使用PHP连接MySQL数据库时&#xff0c;可能会遇到连接失败和写锁问题。这类问题可能会影响应用的正常运行&#xff0c;本文将详细介绍排查和解决这些问题的方法。 一、PHP连接MySQL数据库失败 1. 排查连接失败的常见原因 数据库配置错误&#xff1a; 检查数据库主机、用户名…...

卫星接收天线G/T值怎么计算?附G/T计算excel表格链接

我们在进行无线通信链路设计时&#xff0c;都会涉及接收天线最重要的参数G/T。今天&#xff0c;咱们就来聊聊G/T值该怎么计算&#xff0c;计算过程中有哪些需要留意的地方&#xff0c;以及当你看到产品说明书中标注了G/T指标&#xff0c;还需要进一步了解哪些信息。 G/T的含义 …...

基于dify的营养分析工作流:3分钟生成个人营养分析报告

你去医院做体检&#xff0c;需要多久拿到体检报告呢&#xff1f;医院会为每位病人做一份多维度的健康报告吗&#xff1f;"人工报告需1小时/份&#xff1f;数据误差率高达35%&#xff1f;传统工具无法个性化&#xff1f; Dify工作流AI模型的组合拳&#xff0c;正在重塑健康…...

Kali Linux 安全工具解析

Kali Linux 安全工具解析 目录 Kali Linux 安全工具解析一、Kali Linux 概述1.1 核心特性1.2 系统要求 二、核心工具分类与实战应用2.1 信息收集工具2.1.1 Nmap2.1.2 Recon-ng2.1.3 theHarvester 2.2 漏洞利用工具2.2.1 Metasploit Framework2.2.2 SQLMap2.2.3 Burp Suite 2.3 …...

端午编程小游戏--艾草驱邪

刚刚过去的端午&#xff0c;参加了学校的一个活动&#xff0c;用python做了一个小游戏&#xff0c;当然这个小游戏还可以继续改进&#xff0c;可以加个bgm什么的...... 可以小玩一下 import pygame import random import math import sys import timepygame.init() pygame.mi…...

新成果:GaN基VCSEL动态物理模型开发

作为高速数据传输与光电信号处理的核心器件&#xff0c;垂直腔面发射激光器&#xff08;VCSEL&#xff09;在高速光通信、激光雷达等领域应用广泛&#xff0c;其动态特性直接关联器件调制速率及稳定性等关键参数。近期&#xff0c;天津赛米卡尔科技有限公司技术团队开发了GaN基…...

0x-4-Oracle 23 ai-sqlcl 25.1.1 独立安装-配置和优化

一、独立安装sqlcl 1. ​安装 Java 环境​ SQLcl 需要 Java 1.8.0_220 或更高版本&#xff0c; Oracle Linux9.6 上已经默认安装Oracle 23ai后Java 是11 lts版本 如果java jdk安装错误将遇上SQLcl困扰n多人的bug sql /nolog 错误&#xff1a;找不到或加载主类 oracle.dbto…...

Appium+python自动化(十一)- 元素定位- 下

1、 List定位 List顾名思义就是一个列表&#xff0c;在python里面也有list这一个说法&#xff0c;如果你不是很理解什么是list&#xff0c;这里暂且理解为一个数组或者说一个集合。首先一个list是一个集合&#xff0c;那么他的个数也就成了不确定性&#xff0c;所以这里需要用复…...

免费批量PDF转Word工具

免费批量PDF转Word工具 工具简介 这是一款简单易用的批量PDF转Word工具&#xff0c;支持&#xff1a; 批量转换多个PDF文件保留原始格式和布局快速高效的转换速度完全免费使用 工具地址 下载链接 网盘下载地址&#xff1a;点击下载 提取码&#xff1a;8888 功能特点 ✅…...

OD 算法题 B卷【水果摊小买卖】

文章目录 水果摊小买卖 水果摊小买卖 小王手里有点闲钱&#xff0c;想做点水果买卖&#xff0c;给出两个数组m, n&#xff0c; m[i]表示第i个水果的成本价&#xff0c;n[i]表示第i个水果能卖出的价格&#xff1b;假如现在有本钱k&#xff0c;试问最后最多能赚多少钱&#xff1…...

Mac/iOS 如何解压 RAR 格式压缩包:常用工具与详细操作步骤

一、Mac 系统解压 RAR 文件之法 Mac 系统上解压 RAR 文件有多种方法&#xff0c;除了系统自带的一些简单功能外&#xff0c;还可以借助特定的软件来实现高效解压。以下将介绍几款常用工具的解压操作。 &#xff08;一&#xff09;解压专家解压步骤 解压专家 是一款在 Mac 和 …...

二进制安全-IDA Pro-API

idaapi 是 IDA Pro&#xff08;Interactive Disassembler Professional&#xff09; 反汇编工具的 Python API 接口&#xff0c;用于开发自动化脚本、插件和自定义分析工具。通过 idaapi&#xff0c;开发者可以访问 IDA Pro 的核心功能&#xff08;如反汇编、符号分析、交叉引用…...