env(environment)是Linux/Unix系统中用于打印当前环境变量或在修改后的环境中执行命令的工具。它允许用户在临时修改的环境变量下运行命令,而不会影响当前Shell的配置。env也是脚本中常用的解释器定义工具(shebang),例如#!/usr/bin/env python可以确保使用正确的Python解释器路径。
env的核心价值在于环境隔离和临时配置:它可以创建一个“干净”的环境运行命令,或者临时覆盖特定环境变量,避免污染当前Shell会话。掌握env对于脚本编写、软件测试、调试环境问题等场景至关重要。
1. 基本语法
| 命令 | 说明 |
|---|
env | |
env --help | |
env --version | |
env -0 | |
env -i | |
2. 查看环境变量
| 命令 | 说明 |
|---|
env | |
env | sort | |
env | grep '^PATH=' | |
env | grep '^HOME=' | |
env | grep '^LANG=' | |
env | grep -E '^[A-Z_]+=' | |
env | wc -l | |
3. 临时变量运行命令
为单个命令临时设置环境变量,不影响当前Shell:
| 命令 | 说明 |
|---|
VAR=value env command | |
VAR1=dev VAR2=1 env command | |
env PATH=/custom/bin:$PATH command | |
env LANG=C ls -l | |
env HOME=/tmp bash | |
env DEBUG=1 ./script.sh | |
env http_proxy=http://proxy:8080 curl https://example.com | |
注意: 这种临时变量仅在命令执行期间生效,命令结束后变量消失。
4. 清理或移除变量
| 命令 | 说明 |
|---|
env -i command | |
env -i PATH=/usr/bin:/bin bash --noprofile --norc | |
env -u VAR command | |
env -u http_proxy curl https://example.com | |
env -i VAR=value command | |
env -i HOME=/tmp PATH=/bin bash | |
示例:
# 完全干净的环境
env -i /bin/bash --noprofile --norc
# 只保留PATH运行脚本
env -i PATH=/usr/bin:/bin ./script.sh
5. 常用环境变量
| 变量 | 说明 |
|---|
PATH | |
HOME | |
USER | |
SHELL | |
LANG | |
LC_ALL | |
TZ | |
EDITOR | |
VISUAL | |
TERM | |
TMPDIR | |
PWD | |
OLDPWD | |
DISPLAY | |
http_proxy | |
https_proxy | |
NO_PROXY | |
6. 实用组合模式
| 命令 | 说明 |
|---|
env -i PATH=$PATH command | |
env | grep -v '^_' | sort | |
env -0 | xargs -0 -n1 echo | |
diff <(env) <(env -i bash -c env) | |
env > environment.txt | |
source environment.txt | |
env -i $(cat .env | xargs) command | |
7. Shebang用法
在脚本首行使用/usr/bin/env可以增强脚本的可移植性:
| Shebang | 说明 |
|---|
#!/usr/bin/env python | |
#!/usr/bin/env bash | |
#!/usr/bin/env node | |
#!/usr/bin/env perl | |
传统写法 vs env写法:
#!/usr/bin/python # 硬编码路径,可移植性差
#!/usr/bin/env python # 使用PATH查找,可移植性好
8. 调试与故障排查
| 命令 | 说明 |
|---|
env | grep -E 'PATH|LD_' | |
env -i bash -c 'echo $PATH' | |
strace -e execve env command 2>&1 | grep execve | |
env -u LD_PRELOAD command | |
env -i bash --noprofile --norc | |
printenv | |
9. 常用选项速查
10. env vs export vs set
| 命令 | 说明 |
|---|
env | 显示所有环境变量(仅导出的变量,不包括Shell局部变量) |
export | |
set | |
printenv | |
示例对比:
$ local_var="test"# Shell局部变量
$ export exported_var="test"# 环境变量
$ env | grep test# 只显示 exported_var
$ set | grep test# 显示 local_var 和 exported_var
11. 故障排查
| 问题 | 解决方法 |
|---|
| 临时变量不持久 | env VAR=value command |
| env -i后命令找不到 | 空环境中PATH为空,需手动设置:env -i PATH=/usr/bin:/bin command |
| 输出难以安全解析 | 使用env -0配合支持NUL分隔的工具(如xargs -0) |
| 变量在Shell中仍然可见 | env不修改父Shell环境,需使用unset或export在Shell中操作 |
| locale敏感命令行为异常 | 检查LANG等locale变量是否被覆盖,使用env -u LANG command |
| 脚本shebang不生效 | 确保#!/usr/bin/env interpreter语法正确,解释器在PATH中 |
| PATH被覆盖导致命令丢失 | 临时设置PATH时保留原路径:env PATH=$PATH:/new/path command |
温馨提示: env是环境隔离的利器。在脚本中使用#!/usr/bin/env python可以显著提高可移植性,避免硬编码解释器路径。调试环境问题时,env -i bash --noprofile --norc可以启动一个干净的环境,帮助排查配置文件的干扰。临时覆盖变量时,注意env VAR=value command中的=两边不能有空格。在安全敏感的场景中,使用env -i创建空环境可以防止环境变量注入攻击。处理包含特殊字符的环境变量输出时,env -0是更安全的选择。