env仅显示已导出的环境变量,不包括未export的本地变量、bash内置变量及函数;printenv专注查询,支持单变量查看且POSIX兼容性更好;查全部变量用set或declare -p。

直接查看所有环境变量用 env 命令就行
运行 env 就能列出当前 shell 会话中所有已导出的环境变量,每行一个 KEY=VALUE 格式。它只显示被 export 过的变量,不包括普通 shell 变量(比如 foo=bar 未执行 export foo 就不会出现)。
常见误操作是以为 env 能看到全部变量,其实它看不到 bash 内置变量(如 BASH_VERSION)或未导出的本地变量。如果想看更全的,得换命令。
printenv 和 env 有什么区别
printenv 功能和 env 高度重叠,但更专注“查”:不带参数时行为一致;带参数时可查单个变量,比如 printenv PATH,而 env PATH 会报错或启动新进程(取决于实现)。
-
env更偏向“运行程序时临时设置环境”,比如env DEBUG=1 ./app -
printenv是纯查询工具,POSIX 标准,行为更稳定 - 某些精简系统(如 Alpine)可能没装
env,但printenv几乎必有
想看包括未导出变量在内的全部 shell 变量怎么办
用 set 命令。它会输出当前 shell 的所有变量(含函数定义),远比 env 多,但信息杂乱,包含大量内部变量(如 UID、PS1、函数体)。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
实用技巧:
- 过滤出纯环境变量:
set | grep '^[a-zA-Z_][a-zA-Z0-9_]*=' - 排除函数定义(避免大段代码干扰):
set -o | grep -v "function"不起作用,正确做法是declare -p | grep '^declare -x',其中-x表示已导出,等价于env输出 - 想看某个变量是否导出:
declare -p VARNAME,输出含-x就是环境变量
为什么在脚本里执行 env 看不到自己 export 的变量
典型现象:在 shell 脚本里写了 export MYVAR=123,接着写 env | grep MYVAR 却没结果——这通常是因为脚本以非交互方式执行(比如 sh script.sh),而 sh 不一定是 bash,也不一定支持同种变量语法。
排查要点:
- 确认脚本开头用了
#!/bin/bash,否则export可能不生效(尤其在 dash 等 POSIX shell 下) - 检查是否在子 shell 中执行:管道、括号命令组(
( export X=1; env ))里的export不会影响外层 -
env显示的是当前进程的环境,不是脚本文件里“写过的变量”,变量必须实际执行并导出才存在
最稳妥的验证方式是:在脚本末尾加 echo "MYVAR=$MYVAR" 和 printenv MYVAR 对照看。

















