重要概念

起源

Linux 中的环境变量源自早期 UNIX 系统的设计需求。 通过环境变量,用户和进程能够动态地影响系统行为,而不需要修改系统的核心代码。 这种灵活性和可配置性使环境变量成为 Linux 系统和应用程序配置的关键部分。

在 UNIX 中,每个进程都有自己的环境(即一组环境变量),这些环境变量在进程的启动时由父进程传递给子进程。 最典型的例子是当用户登录系统时,系统启动的 Shell 进程会继承一组默认的环境变量,例如用户的主目录、Shell 类型等。 用户可以在这个基础上修改或添加环境变量,影响自己启动的程序或进程的行为。

概念勘误

有些书籍和文章会把环境变量分为全局环境变量和局部环境变量,但这种分类是不准确的, 因为在官方的文档中,从来没有这两种分类的定义,甚至连英文名称也没有。 因此,为了避免语义上的逻辑问题,本文不会对环境变量进行上述的分类。

《Linux 命令行与Shell 脚本编程大全》

《Linux Command Line and Shell Scripting Bible》

上面这本书关于环境变量的章节是有问题的,不是翻译的问题,原版就有问题。

打印环境变量

命令:printenv

不带参数会打印所有环境变量。

printenv | head -n 3
SHELL=/bin/bash
PWD=/home/kuga
LOGNAME=kuga

打印指定环境变量。

printenv PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

命令:env

不带参数会打印所有环境变量。

env | head -n 3
SHELL=/bin/bash
PWD=/home/kuga
LOGNAME=kuga

命令:echo

打印指定变量,可以是环境变量或 Shell 变量。

echo $HOME
/home/kuga

自定义 Shell 变量

定义名为 soda 的 Shell 变量,值为 green。

soda=green
echo $soda
green

使用 printenv 访问

printenv soda

输出为空,因为 soda 不是环境变量,它只是一个 Shell 变量

使用命令分组 () 访问

(echo $soda)
green

使用命令分组 () 修改

(soda=yellow; echo $soda); echo $soda
yellow
green

Subshell 内部的修改不会影响外部的数据。

创建 Bash 实例访问

bash
echo $soda

输出为空,这就是普通 Shell 变量的基本作用域。

自定义环境变量

可以通过 export 指令把 Shell 变量转变为环境变量,官方手册的定义如下。

Mark each name to be passed to child processes in the environment.
翻译:标记变量名称,使其在环境中可以传递给子进程。

可以同时定义和导出变量,也可以分开操作。

export soda=green
soda=green; export soda;

使用 printenv 访问

转变为环境变量之后,使用 printenv 就能正常打印了。

printenv soda
green

使用命令分组 () 访问

(printenv soda)
green

使用命令分组 () 修改

(soda=yellow; echo $soda); echo $soda
yellow
green

同样,内部修改环境变量是不会影响外部的数据。

创建 Bash 实例访问

bash -c "printenv soda"
green

环境变量在新创建的 Bash 实例中是能访问的。

查看所有 export 变量

不带参数,或使用 -p 就能打印所有 export 变量。

export
export | grep soda
declare -x soda="green"

取消 export 环境变量

使用 -n 选项就能取消 export,变回普通的 Shell 变量。

export -n soda
printenv soda; echo $soda

printenv 无输出,echo 正常输出,因为 soda 已经不再是环境变量。

删除变量

下面会删除整个变量,无论是环境变量还是 Shell 变量。

unset soda
echo $soda

命令:declare

用于声明变量和属性,不带任何参数就输出所有的变量声明和当前值。

Declare variables and give them attributes. If no names are given, then display the values of variables instead.

常用参数:

  • -i:将变量声明为整数。
  • -r:将变量声明为只读。
  • -x:将变量导出为环境变量。
  • -p:显示变量的声明和当前值。

不带参数声明

效果和普通的 Shell 变量一样。

declare soda="green"
echo $soda

显示当前变量的声明

declare -p soda
declare -- soda="green"

显示所有变量的声明

declare -p

声明环境变量

declare -x soda="green"
printenv soda
green

export 中也能看到 soda 的定义。

export | grep soda

-x 与 -- 的区别

不难发现,可以通过声明的符号区分不同的变量类型。

  • -x:环境变量的声明。
  • --:普通 Shell 变量的声明。
declare -p soda
declare -x soda="green"

取消 export 后。

export -n soda
declare -p soda
declare -- soda="green"

内建命令手册

有些内建命令使用 man 是无法查看手册的,但可以使用 help 命令,或 --help 选项。

export

type -a export
export is a shell builtin

help export
export --help

declare

同上

unset

同上