Linux_环境变量_命令行参数

一.环境变量

在Linux中自己写的程序必须要带路径才能运行,相对路径或是绝对路径,但是像ls pwd这样的程序,不带路径也能运行。
image.png
当你想要运行一个程序时:

  1. 如果带有路径的话,则直接将对应路径的程序加载进内存,变为进程,执行代码。
  2. 如果不带路径的话,则操作系统会去系统默认路径下搜索,没有找到则报错。

这个系统默认路径就是PATH环境变量,它里面存放了一些经常需要执行的命令路径,有了环境变量后,我们执行程序时,不用加路径,操作系统也能找到对应的位置。
像ls,touch这样的命令,它的路径已经存放在了对应的PATH环境变量里,我们自己写的程序的路径没有在PATH中,所以在查找时,找不到就报错了。只要将我们写的程序地址,加入到PATH环境变量里,就不会报错了。

1.1 概念
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
  • 环境变量本质上是shell进程内部的一张表,当启动shell时,从用户的配置文件读取信息,初始化环境变量表

image.png

  • 同时,在命令行中可以创建shell本地变量

image.png

1.2 查看环境变量

1.2.1 echo 查看某个环境变量

image.png

1.2.2 env 查看环境变量

image.png

  • PATH :系统默认搜索路径
  • LOGNAME:登录SHELL的用户
  • USER:当前正在使用的用户
1.2.3 set 查看本地变量和环境变量

image.png

1.2.4 unset 取消本地变量和环境变量

image.png

1.2.5 export 将本地变量导入环境变量表中

image.png

1.2.6 putenv
  • 防止putenv里面出现指针问题。防止指针内容改变导致环境变量一直变化

1.3 代码中使用环境变量

在bash上运行的程序都是bash的子进程,在创建子进程时,父进程将它的环境变量表传递到子进程中,所以子进程可以访问环境变量表,这也说明了环境变量表具有全局属性,但是bash中的本地变量不能传递给子进程,只能在bash内部使用。

  1. 使用main函数参数来获取

env是一个指针数组,是一个环境变量表,最后一个位置总是为NULL,所以结束的判断为env[i]

	1 #include<stdio.h>2 #include<unistd.h>3 4 
W>  5 int main(int argc, char* argv[], char* env[])6 {7    int i = 0;8    for (; env[i]; ++i)9    {10      printf("env[%d], %s\n", i, env[i]);11    }12     return 0;13 }
  1. 使用全局变量environ来获取
    1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 
W>  5 int main()6 {7   extern char** environ;8 9   for (int i = 0; environ[i]; ++i)10   {11     printf("environ[%d], %s\n", i, environ[i]);                                                                                                                                                            12   }13   return 0;14 }15 
  1. 使用函数获取(推荐)

上述两种方法需要程序员自己遍历环境变量表来获取对应的环境变量,使用不方便,使用函数获取更为简单。
image.png

    1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 
W>  5 int main()6 {7   char* path = getenv("PATH");// putenv 可以导入环境变量8   if (path != NULL)                                                                                                                                                                                        9   {10     printf("%s\n", path);11   }12   return 0;13 }14   

二.命令行参数

main参数一般有三个int main(int argc, char* argv[], char* env[])

  • argv:指针数组,类似于env环境变量表,存放的是一个个字符串,最后一个位置是NULL
  • argc:表示argv里面有几个字符串
    1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 
W>  5 int main(int argc, char* argv[], char* env[])6 {7   int i = 0;                                                                                                                                                         8   for (; i < argc; ++i)9   {10     printf("argv[%d]->%s\n", i, argv[i]);11   }12   return 0;13 }14 

image.png
通过上述观察,可以很清晰的看出,argv表是由bash父进程制作(在命令行输入的),传递给子进程的。
第一个参数是可执行程序,之后的参数作为命令行选项。

  • ls -a -l 就是传递命令行参数,根据参数的不同,执行不同的代码逻辑

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

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

相关文章

七天入门大模型 :提示词工程 Prompt Engineering,最全的总结来了!

文章目录 技术交流群用通俗易懂方式讲解系列引 言LLM 的超参配置Prompt Engineering指令主要内容少样本学习更加明确的提示善用分隔符思维链提示对输出格式的明确要求 最佳实践案例1. Agent场景&#xff1a;使用prompt实现agent create2. Agent场景&#xff1a;使用system mess…

腾讯云4核8G服务器3年600元?

腾讯云4核8G服务器3年600元&#xff1f;目前的价格是轻量应用服务器4核8G12M带宽一年446元、646元15个月&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;标准型SA2服务器1444.8元一年&#xff0c;在txy.wiki可以查询详细…

thinkphp5.0提示不支持redis,not support: redis

安装PHP扩展 例如宝塔&#xff0c;其他环境请用命令行&#xff0c;安装 redis配置完成以后&#xff0c;修改php.ini把redis扩展打开即可&#xff0c;重启环境

英伟达市值超越谷歌!老黄隔空回应Altman的巨资筹款计划:没必要,真的没必要!

凭借算力上的霸主地位&#xff0c;英伟达正稳步成为科技领域的下一个巨头&#xff0c;在不久的15个月前&#xff0c;英伟达的市值还不足3000亿美元。然而&#xff0c;截至昨日&#xff0c;英伟达股价飙升使其市值达到了1.83万亿美元&#xff0c;超越了Alphabet&#xff08;谷歌…

解锁未来:探秘Zxing二维码技术的神奇世界

解锁未来&#xff1a;探秘Zxing二维码技术的神奇世界 1. 引言 在当今数字化和智能化的社会中&#xff0c;二维码技术已经成为人们生活中不可或缺的一部分。从商品购物、支付结算到健康码、门票核销&#xff0c;二维码无处不在&#xff0c;极大地方便了人们的生活和工作。而Zx…

Peter算法小课堂—区间模型(2)

上次咋们讲了前两个区间模型&#xff1a;1.最大不重叠区间数 2.不重叠区间最少分组数。今天我们就学习&#xff1a;最小区间覆盖问题、区间重叠最厚层数&#xff01; 最小区间覆盖 先看三道题 那么&#xff0c;第1题&#xff0c;它是浮点数的题&#xff0c;也就要求首尾相同。…

JavaScript 事件循环:Event Loop

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 事件循环 是 web 开发中的一个核心概念&#xff0c;它是 JavaScript…

【Azure】微软 Azure 基础解析(五)核心体系结构之管理组、订阅、资源和资源组以及层次关系

本系列博文还在更新中&#xff0c;收录在专栏&#xff1a;「Azure探秘&#xff1a;构建云计算世界」 专栏中。 本系列文章列表如下&#xff1a; 【Azure】微软 Azure 基础解析&#xff08;三&#xff09;描述云计算运营中的 CapEx 与 OpEx&#xff0c;如何区分 CapEx 与 OpEx…

爬虫——ajax和selenuim总结

为什么要写这个博客呢&#xff0c;这个代码前面其实都有&#xff0c;就是结束了。明天搞个qq登录&#xff0c;这个就结束了。 当然也会更新小说爬取&#xff0c;和百度翻译&#xff0c;百度小姐姐的爬取&#xff0c;的对比爬取。总结嘛&#xff01;&#xff01;&#xff01;加…

【Linux】进程信号概念 | 核心转储 | 信号的产生

文章目录 一、信号入门1.1 生活中的信号1.2 进程角度的信号1.3 信号的概念1.4 信号的三种常见处理方式 二、信号的产生2.1 通过终端按键产生信号问题1&#xff1a;OS怎么知道键盘输入了ControlC &#xff1f;问题2&#xff1a;按CtrlC终止进程和按Ctrl\终止进程&#xff0c;有什…

BUGKU-WEB 矛盾

题目描述 进入场景看看&#xff1a; 代码如下&#xff1a; $num$_GET[num]; if(!is_numeric($num)) { echo $num; if($num1) echo flag{**********}; }解题思路 需要读懂一下这段PHP代码的意思明显是一道get相关的题目&#xff0c;需要提供一个num的参数,然后需要传入一个不…

nba2k24 灌篮高手樱木花道面补

nba2k24 灌篮高手樱木花道面补 nba2k23-nba2k24通用 灌篮高手樱木花道面补 下载地址&#xff1a; https://www.changyouzuhao.cn/9539.html