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

命令行参数和环境变量

目录

  • 命令行参数
  • 环境变量

命令行参数

main函数的参数可带可不带
可带:这些参数的意义:int argc, char *argv[]

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 
  4 int main(int argc, char *argv[])
  5 {
  6     int i;
  7     for(i = 0; i < argc; i++)
  8     {
  9         printf("argv[%d] -> %s\n", i, argv[i]);                                                                                                            
 10     }
 11 }
[tt@kunkun state]$ ./myprocess 
argv[0] -> ./myprocess
[tt@kunkun state]$ ./myprocess -a
argv[0] -> ./myprocess
argv[1] -> -a
[tt@kunkun state]$ ./myprocess -a -b
^[[Aargv[0] -> ./myprocess
argv[1] -> -a
argv[2] -> -b
[tt@kunkun state]$ ./myprocess -a -b -c
argv[0] -> ./myprocess
argv[1] -> -a
argv[2] -> -b
argv[3] -> -c
[tt@kunkun state]$ ./myprocess -a -b -c -d
argv[0] -> ./myprocess
argv[1] -> -a
argv[2] -> -b
argv[3] -> -c
argv[4] -> -d

在这里插入图片描述

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <string.h>
  4 int main(int argc, char *argv[])
  5 {
  6     if(argc != 2)
  7     {
  8         printf("Usage: %s -[a,b,c,d]\n", argv[0]);
  9         return 1;
 10     }
 11 
 12     if(strcmp(argv[1], "-a") == 0)
 13     {
 14         printf("this is function1\n");
 15     }
 16     else if(strcmp(argv[1], "-b") == 0)
 17     {
 18         printf("this is function2\n");                                                                                                                     
 19     }
 20     else if(strcmp(argv[1], "-c") == 0)
 21     {
 22         printf("this is function3\n");
 23     }
 24     else if(strcmp(argv[1], "-d") == 0)
 25     {
 26         printf("this is function4\n");
 27     }
 28     else
 29     {
 30         printf("no this function!\n");
 31     }
 32}
[tt@kunkun state]$ ./myprocess 
Usage: ./myprocess -[a,b,c,d]
[tt@kunkun state]$ ./myprocess -a
this is function1
[tt@kunkun state]$ ./myprocess -b
this is function2
[tt@kunkun state]$ ./myprocess -c
this is function3
[tt@kunkun state]$ ./myprocess -d
this is function4
[tt@kunkun state]$ ./myprocess -e
no this function!

为什么要有命令行参数:
本质:命令行参数本质是交给我们程序的不同的选型,用来定制不同的程序功能。命令行中会携带很多的选项。

父进程的,默认能被子进程看到并访问
命令行中启动的程序,都会变成进程,其实都是bash的子进程
父进程bash做的命令行参数的传递

环境变量

Linux中,存在一些全局的设置,表明告诉命令行解释器,应该去那些路径下去寻找可执行程序

[tt@kunkun ~]$ /usr/bin/ls -l --color
total 16
drwxrwxr-x 4 tt tt 4096 Feb  6 21:16 code
-rw-rw-r-- 1 tt tt    0 Jan 21 21:15 code.c
drwxrwxr-x 2 tt tt 4096 Jan 22 15:48 gdb
-rw-rw-r-- 1 tt tt  827 Jan 20 22:03 install.sh
drwxrwxr-x 3 tt tt 4096 Jan 21 21:07 test
[tt@kunkun ~]$ cd /usr/bin
[tt@kunkun bin]$ ./ls -l

PATH:环境变量
echo $PATH:打印环境变量的内容
系统中很多的配置,在我们登录Linux系统的时候,已经被加载到bash进程中
bash在执行命令的时候,需要先找到命令,因为未来要加载

[tt@kunkun ev]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/tt/.local/bin:/home/tt/bin

不能直接给环境变量赋值,相当于全部更改
但重启由于系统设置会重置
默认我们查到的环境变量是内存级的

[tt@kunkun ev]$ pwd
/home/tt/code/ev
[tt@kunkun ev]$ PATH=/home/tt/code/ev

该怎么做呢
但是依旧是内存级的

[tt@kunkun ev]$ PATH=$PATH:/home/tt/code/ev
[tt@kunkun ev]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/tt/.local/bin:/home/tt/bin:/home/tt/code/ev

最开始的环境变量不是在内存中,而是在系统的对应的配置文件中
环境变量默认是在配置文件中的

[tt@kunkun ~]$ vim .bash_profile 
[tt@kunkun ~]$ vim .bashrc
[tt@kunkun ~]$ vim /etc/bashrc

在这里插入图片描述
env查看所有环境变量

[tt@kunkun ~]$ echo $HOME
/home/tt
[tt@kunkun ~]$ echo $PWD
/home/tt
[tt@kunkun ~]$ echo $SHELL
/bin/bash
[tt@kunkun ~]$ echo $HISTSIZE
1000
[tt@kunkun ~]$ history | head
    1  pwd
    2  su - tt
    3  exit
    4  pwd
    5  yum -y update
    6  yum -y install tree
    7  su root
    8  curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
    9  ll
   10  sudo yum install -y gcc-c++

自己导环境变量
内存级

[tt@kunkun ~]$ export THIS_IS_MY_ENV=hellott
[tt@kunkun ~]$ env | grep hellott
THIS_IS_MY_ENV=hellott
[tt@kunkun ~]$ unset THIS_IS_MY_ENV
[tt@kunkun ~]$ env | grep hellott

本地变量

[tt@kunkun ~]$ hello=123456
[tt@kunkun ~]$ env | grep hello
[tt@kunkun ~]$ echo $hello
123456

环境变量默认也是可以被子进程拿到的。环境变量们,默认在bash内部

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<string.h>
  4 
  5 int main()
  6 {
  7     extern char **environ;
  8     int i;
  9     for(i = 0; environ[i]; i++)
 10     {
 11         printf("env[%d]->%s\n", i, environ[i]);                                                                                                          
 12     }
 13 }

bash进程启动的时候 ,默认会给我们的子进程形成两张表:
argv[]命令行参数表、env[]环境变量表。bash通过各种方式交给子进程。
用户输入的命令行、从OS的配置文件来

 1 #include<stdio.h>
 2 #include<unistd.h>
 3 #include<string.h>
 4 
 5 int main(int argc, char *argv[], char *env[])
 6 {
 7     int i;
 8     for(i = 0; env[i]; i++)
 9     {
10         printf("env[%d]->%s\n", i, env[i]);                                                                                                            
11     }
12}

环境变量具有系统级的全局属性,因为环境变量本身会被子进程继承下去
在这里插入图片描述
本地变量只在本bash内部有效,无法被子进程继承下去
导成环境变量,此时才能够被获取


http://www.kler.cn/a/542927.html

相关文章:

  • Kotlin实战经验:将接口回调转换成suspend挂起函数
  • 【DeepSeek服务器繁忙,请稍后再试...如何解决?】
  • 【编程实践】vscode+pyside6环境部署
  • 通过Chatbox和API实现本地使用DeepSeek(R1满血版)
  • 【算法】动态规划专题⑪ —— 区间DP python
  • C++17 新特性解析
  • git服务器搭建,gitea服务搭建,使用systemclt管理服务
  • c版的findcontours改写,输出为vector<vector<cPoint>>
  • Git在不同电脑上使用
  • 自学人工智能大模型,满足7B模型的训练和微调以及推理,预算3万,如何选购电脑
  • VSCode 如何使用 eslint
  • 基于 GEE 利用插值方法填补缺失影像
  • SMU Winter 2025 div1 2nd
  • PDF 文件的安全功能概述
  • Unity做2D小游戏4------让角色动起来
  • RDKit 给3D信息缺失的sdf生成三维结构
  • 黑马Redis详细笔记(实战篇---短信登录)
  • 电脑出现蓝屏英文怎么办?查看修复过程
  • 【物联网】电子电路基础知识
  • RocketMQ、RabbitMQ、Kafka 的底层实现、功能异同、应用场景及技术选型分析
  • 华为openEuler部署docker
  • CCFCSP第34次认证第一题——矩阵重塑(其一)
  • DeepSeek应用——与word的配套使用
  • 活动预告 | 解锁 Excel 新境界 —— AI 技术赋能下的数据分析超级引擎!
  • 【C++高并发服务器WebServer】-17:阻塞/非阻塞和同步/异步、五种IO模型、Web服务器
  • 【Windows/C++/yolo开发部署04】使用CLI 和 python进行推理