【Linux】命令行参数和环境变量

目录

一、命令行参数

[1.1 main函数的参数](#1.1 main函数的参数)

[1.2 命令行参数](#1.2 命令行参数)

二、环境变量

[2.1 概念](#2.1 概念)

[2.2 查看和设置环境变量](#2.2 查看和设置环境变量)

[2.2.1 查看环境变量](#2.2.1 查看环境变量)

[2.2.2 设置环境变量](#2.2.2 设置环境变量)

[2.2.3 设置PATH环境变量](#2.2.3 设置PATH环境变量)

[2.2.4 环境变量表](#2.2.4 环境变量表)

[2.2.5 本地变量和环境变量的区别](#2.2.5 本地变量和环境变量的区别)

[2.2.6 内建命令和常规命令](#2.2.6 内建命令和常规命令)

[2.3 环境变量相关的指令](#2.3 环境变量相关的指令)


一、命令行参数

1.1 main函数的参数

C语言中,'main'函数的标准原型是:

int main(int argc, char *argv[])

或者,如果你不需要命令行参数,可以省略它们:

int main(void)

在C和C++等编程语言中,一个程序的入口通常是'main'函数。'main'函数可以接受两个参数,这两个参数提供了程序启动时的命令行参数信息

  1. 'argc '(argument count):**这是一个整数,表示传递给程序的命令行参数的数量。**数组中的第一个元素('argv[0]')是程序的名称,因此'argc'总是至少为1。
  2. 'argv '(argument vector):这是一个指向字符串数组的指针,数组中的每个元素都是一个指向命令行参数的指针。第一个元素('argv[0]')是程序的名称,后续元素是程序启动时跟随在程序名称后面的参数。

例如,如果一个程序名为'myprog',并且用户在命令行中输入了以下命令:

myprog arg1 arg2 arg3

那么'main'函数将接收到的参数如下:

  • 'argc'将会是4,因为包括程序名称在内总共有4个参数。

  • 'argv'将会是一个包含4个字符串的数组:{"myprog", "arg1", "arg2", "arg3"}。

在程序中使用'argc'和'argv',可以编写处理命令行参数的代码,从而使得程序的行为可以根据用户的输入来改变。

1.2 命令行参数

**在Linux操作系统中,命令行参数是用户在命令行界面中输入的,紧跟在命令后面的数据。**这些参数提供了额外的信息,指导命令如何执行。命令行参数可以用来修改命令的行为,指定输入文件或目录,控制输出格式,以及执行其他各种任务。

可以理解为,命令是一个可执行程序,命令行参数使得命令可以支持各种指令级别的命令行选项的设置。通过命令行参数,用户可以在不修改程序源代码或配置文件的情况下,快速地调整程序的运行方式。

二、环境变量

2.1 概念

在Linux操作系统中,环境变量是用于存储有关系统环境的信息的变量,它们对于系统配置和运行在系统上的程序来说非常重要。环境变量通常是由系统自动设置,也可以由用户或程序设置。它们存在于每个进程的上下文中,并且可以传递给该进程创建的子进程。

在Linux中,常见的环境变量包括

  • 'PATH':决定了Shell搜索可执行文件的目录列表。

  • 'HOME':当前用户的主目录。

  • 'PWD':当前工作目录。

  • 'USER':当前登录的用户名。

  • 'SHELL':当前用户的Shell程序路径。

  • 'TERM':当前终端的类型。

  • 'LANG':系统语言和区域设置。

  • 'EDITOR':用户默认的文本编辑器。

  • 'PS1':Shell提示符的格式。
    环境变量的作用包括:

1.配置程序行为:许多程序会检查特定的环境变量来决定如何运行。例如,'PATH'变量决定 了Shell如何在当前目录和系统路径中查找可执行文件。

2.存储用户和系统信息:环境变量可以存储用户的主目录位置('HOME')、用户名('USER')、终端类型('TERM')等信息。

3.自定义环境:用户可以设置自己的环境变量来定制Shell的行为,或者为特定的应用程序提供配置信息。

4.传递信息:环境变量可以在进程之间传递信息,例如,一个进程可以通过设置环境变量来向其子进程传递特定的参数或配置。

2.2 查看和设置环境变量

2.2.1 查看环境变量

  • 在终端中,输入env命令时,它会列出当前用户的环境中的所有变量,包括系统变量和用户定义的变量。
  • 在C和C++代码中,使用getenv函数,它会返回一个指向相应值的指针,用来获取指定名称的环境变量的内容。
  • mian函数也可以有第三个参数,即环境变量表,通过环境变量表可以查看环境变量。
  • 在C和C++编程语言中,environ是一个全局指针(extern char **environ , <unsitd.h>),指向环境变量表。

2.2.2 设置环境变量

export 命令是Shell的一个内置命令,用于设置或修改环境变量。

例如:export VARIABLE=value

VARIABLE:要设置的环境变量名称。

value:环境变量的值。

直接在命令行修改,修改的是父进程的环境变量,这是在内存中的临时值,重启后就没有了,要是想每次启动都会存在这个环境变量,需要在脚本配置文件(家目录中的.bash_profile文件)中修改。

2.2.3 设置PATH环境变量

PATH环境变量定义了系统在执行命令时应该在哪些目录中搜索可执行文件。在命令行中输入一个命令时,系统会按照PATH环境变量的值,在指定的目录中查找命令的可执行文件。

例如,如果您的PATH环境变量设置如下:(注:冒号为分隔符)

PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

这意味着当您在命令行中输入一个命令时,系统会按照以下顺序在以下目录中搜索可执行文件:

/usr/local/bin

/usr/bin

/bin

/usr/sbin

/sbin

如果命令在这些目录中找到,系统会执行它;如果找不到,系统会提示命令未找到。

可以通过修改PATH环境变量来指定不同的目录,或者在特定情况下为单个命令设置不同的路径。 例如,如果想为某个特定的命令新增一个临时路径 ,可以这样做:
MY_COMMAND=/path/to/my/command
PATH=PATH:MY_COMMAND

这将追加 /path/to/my/command到PATH环境变量的值中,从而使系统在执行MY_COMMAND命令时会先在/path/to/my/command目录中查找可执行文件。($PATH是PATH原本的值;重新登陆时会恢复成原PATH

2.2.4 环境变量表

系统启动我们的程序的时候,可以选择给我们的进程(main)提供两张表:

1.命令行参数表

2.环境变量表

命令行启动的进程都是shell/bash的子进程, 子进程的命令行参数和环境变量,是父进程bash给我们传递的。修改PATH修改的是bash进程内部的环境变量信息,每一次重新登陆,都会给我们形成新的bash解释器,并且新的bash解释器自动从父进程的环境变量信息中读取形成自己的环境变量表信息。环境变量信息是以脚本配置文件的形式存在的。

每一次登陆的时候,bash进程都会在家目录中(/home/username)读取 .bash_profile 配置文件中的内容,为我们bash进程形成一张环境变量表信息。因此长久的保存环境变量的信息就要在配置文件中设置环境变量。

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

2.2.5 本地变量和环境变量的区别

  • 本地变量:只在bash进程内部有效,不会被子进程继承下去。
  • 环境变量:通过让所以子进程继承来实现自身的全局性。

2.2.6 内建命令和常规命令

  • 内建命令:shell命令行的一个函数,它们不依赖于外部可执行文件,可以直接读取shell内部定义的本地变量。
  • 常规命令:在磁盘中真正存在的可执行文件,需要由fork()创建子进程执行的命令。当用户输入一个常规命令时,Shell会查找命令对应的文件,并执行它。

例如上面讲到的export就是一个内建命令,它可以读取到命令行中的本地变量,并将它导入到环境变量表。而可执行程序读取不到该变量。

常见的内建命令:cd、echo、export、pwd、history、alias(设置别名)、unalias(删除别名)、exit(退出Shell)

常见的常规命令:ls、cp、mv、rm、grep、tar、ssh(安全外壳协议)、vim

2.3 环境变量相关的指令

  • 显示某个环境变量值:echo $变量名
  • 显示所有环境变量:env
  • 设置环境变量:export 变量名=内容
  • 设置本地变量:变量名=内容
  • 取消环境变量或本地变量:unset 变量名
  • 显示环境变量和本地变量:set
相关推荐
广而不精zhu小白2 小时前
CentOS Stream 9 挂载Windows共享FTP文件夹
linux·windows·centos
一休哥助手2 小时前
全面解析 Linux 系统监控与性能优化
linux·运维·性能优化
二进制杯莫停2 小时前
掌控网络流量的利器:tcconfig
linux
watl03 小时前
【Android】unzip aar删除冲突classes再zip
android·linux·运维
赵大仁3 小时前
在 CentOS 7 上安装 Node.js 20 并升级 GCC、make 和 glibc
linux·运维·服务器·ide·ubuntu·centos·计算机基础
vvw&3 小时前
Docker Build 命令详解:在 Ubuntu 上构建 Docker 镜像教程
linux·运维·服务器·ubuntu·docker·容器·开源
冷曦_sole4 小时前
linux-21 目录管理(一)mkdir命令,创建空目录
linux·运维·服务器
最后一个bug4 小时前
STM32MP1linux根文件系统目录作用
linux·c语言·arm开发·单片机·嵌入式硬件
dessler4 小时前
Docker-Dockerfile讲解(二)
linux·运维·docker
卫生纸不够用4 小时前
子Shell及Shell嵌套模式
linux·bash