set是查看Shell变量的正确命令,因为它能完整列出当前shell中所有变量(含未导出的自定义变量)、函数及内部状态,而env和printenv仅显示已导出的环境变量,无法看到纯Shell变量。

用 set 命令可以查看当前 shell 中所有 Shell 变量,包括已导出的环境变量、未导出的自定义变量,以及函数定义。
为什么 set 是查看 Shell 变量的正确命令
Shell 变量是当前 shell 进程内部维护的变量,不一定传递给子进程。只有执行过 export 的变量才成为环境变量,能被脚本或程序读取;而仅用 VAR=value 定义的变量属于纯 Shell 变量,env 和 printenv 都看不到它——只有 set 能完整列出。
- 输出包含所有变量名和值,未导出变量(如
mytmp=abc)也会显示 - 函数以
funcname () { ... }形式一并输出 - 值中含换行、空格等特殊字符时,
set会自动用单引号包裹,避免解析歧义
如何过滤出纯变量,排除函数和状态信息
set 默认输出内容较多,含函数和内部状态行。常用精简方式:
-
set | grep '^[a-zA-Z_][a-zA-Z0-9_]*='—— 只保留以字母或下划线开头、后接等号的行,基本排除函数和内置状态 -
set | grep -v '^declare' | grep -v '^{' | grep '='—— 在某些 shell(如 bash)中进一步剔除 declare 声明和函数体
对比其他命令,明确边界
别把 Shell 变量和环境变量混淆:
-
env或printenv:只显示已导出的变量,不显示myvar=123这类未 export 的变量 -
echo $VAR:只能查单个,且变量未定义时静默输出空行,无法判断是空值还是根本不存在 -
set是唯一能确认“这个变量是否真的在当前 shell 里定义了”的命令
一个小验证技巧
想确认某个变量到底是 Shell 变量还是环境变量,可以两步比对:
-
set | grep '^MYVAR='有输出 → 它存在于当前 shell -
env | grep '^MYVAR='无输出 → 它没被导出,不是环境变量
这种情况就说明你定义了变量但漏掉了 export MYVAR。


















