Linux - 环境变量

  • 什么是环境变量?

环境变量 (environment variables) 一般是指在操作系统中用来指定操作系统运行环境的一些参数, 是系统提供的一组 name=value 形式的变量.

  • 为什么需要环境变量?

环境变量通常具有某些特殊用途, 例如, 在各个目标文件 (.obj) 进行链接的时候, 相关环境变量帮助编译器查找所链接的动静态库的位置, 生成可执行程序. 此外, 环境变量在系统当中通常具有全局属性.

一. 查看环境变量

常见的环境变量

  • PATH: 指定命令的搜索路径.
  • HOME: 用户家目录 (即用户登录到 Linux 系统中的默认所处目录).
  • SHELL: 当前Shell, 它的值通常是 /bin/bash.

可以通过 echo 指令来查看环境变量, 格式如下:

echo $NAME , NAME 为待查看的环境变量名称.

比如, echo $PATH 查看环境变量 PATH.

PATH

可以看到, 当执行系统提供的指令时, 不需要在指令前加上其所处的路径; 而当执行自己编写的指令时, 则需要在指令前加上其所处的路径.

出现这种现象的原因是 Linux 系统中存在 PATH 环境变量来存放指令的默认搜索路径集合.

可以看到环境变量 PATH 当中有多条路径, 这些路径由冒号 隔开, 当使用系统提供的指令 (如 ls) 时, 系统就会查看环境变量 PATH , 然后从左到右依次在各个路径当中进行查找. 而系统提供的指令实际就位于 PATH 当中的某一个路径下 (/usr/bin), 所以执行系统提供的指令时就算不带路径, 系统也能够通过 PATH 找到其位置.

若想在执行自己编写的指令时, 不带路径, 可以通过以下方法来达成目标.

1. 将自己编写的指令拷贝到环境变量 PATH 的某一路径下

bash 复制代码
sudo cp 自己编写的指令名 /usr/bin

2. 将自己编写的指令所处的目录导入到环境变量 PATH 当中

bash 复制代码
export PATH=$PATH:自己编写的指令所处的目录

HOME

任何一个用户在登录 Linux 系统下都有自己的家目录, 环境变量 HOME 中即保存的该用户的家目录.

当用户为普通用户时.

当用户为超级用户 root 时.

SHELL

可以通过查看环境变量 SHELL 来知道当前所用的命令行解释器的种类.

二. 与环境变量相关的指令

echo

显示某个环境变量的值.

env

显示所有的环境变量.

部分环境变量的意义说明:

环境变量名称 表示内容
PATH 指令的搜索路径
HOME 用户的主工作目录
SHELL 当前Shell
HOSTNAME 主机名
TERM 终端类型
HISTSIZE 记录历史命令的条数
SSH_TTY 当前终端文件
USER 当前用户
MAIL 邮箱
PWD 当前所处路径
LANG 编码格式
LOGNAME 登录用户名

export

设置环境变量.

对已有的环境变量做修改

增添新的环境变量

set

显示本地定义的 shell 变量和环境变量.

unset

清除指定的环境变量.

三. 环境变量的组织方式

命令行参数

C 程序总是从 main 函数开始执行, main 函数的原型是:

其中, argc 是命令行参数的个数, argv 是由指向每个命令行参数字符串的指针所构成的字符指针数组.

编写以下代码, 编译生成可执行程序并运行.

c 复制代码
#include <stdio.h>

int main(int argc, char *argv[])
{
    int i = 0;
    for (; i < argc; i++) {
        printf("argc[%d]:%s\n", i, argv[i]);
    }
    
    printf("argc[%d]:%s\n", i, argv[i]);
    
    return 0;
}

运行结果如下.

mycmd 可执行程序被调用时, argc 的值为 4, argv[0] 指向 ./mycmd 字符串, argv[1] 指向 -a 字符串, argv[2] 指向 -b 字符串, argv[3] 指向 -c 字符串, argv 数组的末尾处总以空指针来标记, 因此, argv[4]为 NULL. 下图描述了命令行参数的组织方式, 被形象地称为命令行参数表.

环境变量

为了使用环境变量, main 函数也可以有如下声明:

envp 是由指向每个以 name=value 形式展现的环境变量字符串的指针所构成的字符指针数组.

编写以下代码, 编译生成可执行程序并运行.

c 复制代码
#include <stdio.h>

int main(int argc, char *argv[], char *envp[])
{
    int i = 0;
    for (; envp[i]; i++) {
        printf("envp[%d]:%s\n",i, envp[i]);
    }
    return 0;
}

运行结果如下.

环境指针 environ

每个 C 程序都会收到一张环境变量表, 与命令行参数表一样, 环境变量表是一个字符指针数组, 每个指针指向一个以 '\0' 结尾的环量字符串, 全局变量 environ 则包含了该指针数组的地址.

编写以下代码, 编译生成可执行程序并运行. (libc 中定义的全局变量 environ 指向环境变量表, environ 没有包含在任何头文件中, 所以在使用 environ 时要用 extern 声明.)

c 复制代码
#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;
}

运行结果如下.

相关推荐
hjjdebug1 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal
其乐无涯1 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
Diamond技术流1 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
斑布斑布1 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习
Spring_java_gg1 小时前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全
✿ ༺ ོIT技术༻1 小时前
Linux:认识文件系统
linux·运维·服务器
会掉头发2 小时前
Linux进程通信之共享内存
linux·运维·共享内存·进程通信
我言秋日胜春朝★2 小时前
【Linux】冯诺依曼体系、再谈操作系统
linux·运维·服务器
饮啦冰美式2 小时前
22.04Ubuntu---ROS2使用rclcpp编写节点
linux·运维·ubuntu