每个进程都有一个环境,即从父进程继承的一组名称—值字符串。shell 使用环境变量,把语言设置、可执行文件搜索路径等配置传递给它启动的程序。
文本操作 · 第 5 课
env (环境变量)
学习 Bash 如何展开、导出、检查和临时覆盖环境变量。
在 Bash 中展开变量值
Bash 会在运行命令前把 $NAME 或 ${NAME} 展开为变量值。为保留完整值作为一个参数,应给展开式加引号:
$ printf '%s\n' "$HOME"
/home/pete
常见环境变量包括:
HOME:当前用户的主目录路径。USER:许多系统的登录环境所提供的用户名。PWD:shell 的当前工作目录。PATH:用于搜索命令名的目录。
值取决于当前进程环境,并不是通用常量。除非启用了更严格的 shell 行为,未设置变量会展开为空字符串。
哪个 Bash 命令会打印 HOME 的值,同时保留它作为一个参数?
检查当前环境
要查看当前为您的会话设置的所有环境变量,您可以使用 env 命令。linux env command 是检查 shell 配置的基本工具。
env
输出由 NAME=value 记录组成,例如:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/bin
PWD=/home/user
USER=pete
环境变量可能包含凭据、令牌、内部路径或其他敏感数据。把完整 env 输出粘贴到公开问题或日志前,必须先审查并遮盖敏感值。
哪个命令会打印新启动进程能够看到的环境?
通过 PATH 查找命令
在您的 env linux 输出中最重要的变量之一是 PATH。您可以使用以下命令专门查看其内容:
$ printf '%s\n' "$PATH"
PATH 是以冒号分隔的目录列表。当命令名不含斜杠时,Bash 会搜索这些目录。
顺序很重要:Bash 会根据名称解析规则使用第一个合适命令。可用 type -a NAME 检查当前 shell 如何解析名称。
要在当前 shell 及其未来子进程中把 /opt/coolapp/bin 加到现有搜索路径前面:
$ export PATH="/opt/coolapp/bin:$PATH"
不要意外用新目录完全替换 PATH,也不要加入不受信任的可写目录。前者可能让正常命令无法解析,后者可能导致运行意外的可执行文件。
哪个命令会在当前 Bash 进程及其未来子进程中,把 /opt/coolapp/bin 加到现有 PATH 前面?
把变量导出给子进程
Bash 变量不会自动成为传给子进程的环境。使用 export 标记要导出的名称:
export TEST=test
当前 Bash 进程现在拥有名为 TEST 的变量,它启动的命令会继承 TEST=test。子进程不能借此改变父进程的环境。
$ printenv TEST
test
该赋值通常持续到取消设置或 shell 退出为止,并不会修改系统级环境。
在 Bash 中,export TEST=test 的主要效果是什么?
为单条命令设置值
把赋值放在命令前,只向该命令的环境提供值:
$ LANG=C sort names.txt
当前 shell 的 LANG 不会永久改变。env 工具也提供另一种显式形式:
$ env LANG=C sort names.txt
使用 env -i COMMAND 可让命令从初始空环境启动,再添加所需赋值。许多程序依赖环境值,因此应谨慎使用。
哪个命令会以 LANG=C 运行 sort names.txt,但不永久改变当前 shell 的 LANG?
在未来会话中加载个人变量
要让未来的交互式 Bash 会话重新创建导出变量,应把合适的 export 行放在这些会话实际读取的启动文件中;对于交互式非登录 Bash,通常是 ~/.bashrc:
export TEST=test
Zsh 通常使用 ~/.zshrc,Fish 则采用不同语法和配置。登录 shell 与非交互式 shell 还可能读取其他文件,因此应先确定 shell 和会话类型,不要假定一个文件能配置所有进程。
要练习环境继承和 shell 配置,可以尝试以下动手实验:
- 在 Linux 中管理 Shell 环境和配置 - 练习创建和管理本地变量和环境变量,理解继承,并通过修改
.bashrc文件使配置持久化。 - Linux 中的环境变量 - 学习环境变量的概念和用法,如何创建、修改和管理它们,以及它们在系统配置中的作用。
课程已完成
你已完成 env (环境变量)
现在,你可以检查并控制 Bash 传给子进程的环境。
使用恰当的引号展开变量值。
查看已导出值,同时避免泄露秘密。
保留并排列
PATH中的命令目录。导出 shell 变量供未来子进程继承。
为单条命令覆盖值,而不改变父 shell。