env 只显示已 export 的环境变量,不包含未导出的变量或函数;printenv 更安全地读取单个变量值;set 显示所有变量(含未 export 的和函数),declare -xp 可精准过滤导出变量。
用 env 查所有环境变量,但只显示 export 过的
env 输出的是当前 shell 中真正“导出”给子进程的变量,比如 PATH、HOME、SHELL。它不包含普通 shell 变量或函数。
常见错误是以为 env 能看到自己刚定义但没 export 的变量:
- 执行
MYVAR=hello后,env | grep MYVAR一定为空 - 必须先
export MYVAR,它才会出现在env列表里 - 如果只想看某一个,直接
env | grep ^PATH=(加^避免匹配到含PATH字样的其他变量)
用 printenv 查单个变量最稳妥,不依赖 $ 展开
printenv PATH 比 echo $PATH 更可靠——它不经过 shell 变量展开,不会因空格、通配符或未引号包裹导致意外截断或报错。
适用场景:
- 脚本中需要安全读取变量值,尤其当值可能含空格或特殊字符时
- 调试时怀疑
$PATH被错误解析(比如echo $PATH显示不全,但printenv PATH完整) - 检查变量是否真的被设置:
printenv NONEXISTENT返回空,无输出;而echo $NONEXISTENT也返回空,但无法区分是空值还是未定义
用 echo $VAR 快速验证,但要注意变量名拼写和大小写
这是最常用也最容易出错的方式。Linux 环境变量严格区分大小写,path 和 PATH 是两个不同变量。
Docker Desktop(linux)
当前 Docker 最新稳定版本之一,主要针对稳定性和兼容性进行了修复优化,适合生产环境与日常开发使用。该版本继续强化 AI 开发支持、容器日志管理以及 Docker Engine 的安全能力,对 Windows/macOS/Linux 平台兼容性进行了进一步优化。
典型问题:
- 输成
echo $path(小写),结果为空——正确是echo $PATH - 中间多打空格:
echo $ PATH会报command not found,因为 shell 把它当成了命令echo后跟参数$和PATH - 想查看变量是否存在但不关心值,可用
echo ${PATH:+set},有值才输出set,否则空白
用 set 看全部变量(含未 export 的),但输出太杂
set 会列出当前 shell 所有变量:环境变量、局部变量、函数定义,总量远超 env。它适合排查“为什么我定义的变量在子 shell 里不见了”这类问题。
关键区别:
-
set | grep ^MYVAR=能查到未export的MYVAR,而env查不到 -
set输出含函数定义,比如ls () { command ls --color=auto "$@"; },容易干扰扫描 - 若只想过滤出纯环境变量,可结合
declare -xp(-x表示 export,-p显示格式化输出)
真正容易被忽略的是:环境变量的“可见性”取决于是否 export,而不是是否定义。很多问题其实不是查不到,而是根本没导出——别急着换命令,先确认 export 是否执行成功。