本文是南科大科学与工程计算中心 Linux 系列教程的第二篇。我们将学习环境变量的概念和使用方法,并了解那些影响程序编译和运行的常用环境变量。
预计阅读时间:30min
前置知识:了解如何启动 shell、C 语言程序编译流程(后文亦会简要介绍)
01
什么是环境变量?为什么要关心它?
在操作系统中,程序会以进程的形式执行,包括我们平常使用的 shell(如 Bash, Zsh, Bourne)。要执行一行命令时,shell 会相应地创建一个新的子进程。对于一个进程而言,环境变量是一系列具有特定名字的值(即一系列键值对);作为进程运行环境的一部分,这些值往往是一些字符串,它们可以被动态设置,并在不改变程序代码的条件下影响程序的行为。
环境变量常用于配置用途,比如指定搜索目录、密码、端口等。父进程可以把自己的环境变量传递给子进程,所以人们常常先在 shell 会话(父进程)中设置环境变量以指定配置,再启动待运行的程序(作为子进程)。子进程在运行过程中通过编程接口读取环境变量(例如,C 程序可以通过 getenv("NAME") 的方式读取名为 NAME 的环境变量),并决定自己的行为。因此,环境变量也可以看作程序的一种输入数据。
因为 shell、编译器等通用的程序所读取的环境变量名称比较固定(例如PATH, LD_LIBRARY_PATH, CFLAGS 等,后文会详细介绍),所以我们可以通过设置环境变量,实现修改可执行文件查找目录、指定编译参数等目的。
02
查看环境变量
运行 printenv 命令,可以列出当前 shell 会话中的所有环境变量,如:
[user@host ~]$ printenvLANG=en_US.UTF-8USER=userLOGNAME=UserHOME=/work/userPATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbinMAIL=/var/spool/mail/user...
若要查看某个特定的环境变量,可以使用 echo 命令,如:
[user@host ~]$ echo $PATH/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
在这个例子中,PATH 是我们想要查看的环境变量的名称;在它前面加上 $ 符号后,shell 会将 PATH 视作一个变量,读取它的值,得到 /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin 这一字符串;然后,这个值被 echo 打印输出。
注:这里的 $PATH 也可写作 ${PATH}。
PATH 是一个特殊的环境变量。在 Linux 系统中,它的值由若干个目录路径拼接而成,并以冒号分隔。当我们在 shell 中输入一行(non built-in)命令时,shell 会按照从左到右的顺序到这些路径中查找与该命令同名的文件,直到找到为止。
03
设置环境变量
方法 1:临时定义
在要运行的命令前面(同一行内),直接加上 key=value 指定环境变量,如:
CC=icc CFLAGS="-O3 -Wall" ./configure
注:这行命令使用 CC 环境变量指定了 icc (Intel C Compiler) 作为 C 编译器,用 CFLAGS 环境变量指定了编译优化和警告参数,并运行 ./configure 进行软件安装前的配置。
使用这种方式指定的环境变量仅对该行命令有效,一般用于一次性的操作。