如何打印所有非环境变量?
这些是我从 shell 启动后自己添加的所有变量,就像执行以下操作时一样:
read abc
123
# echo ${abc} => 123
或者
xyz='123'
# echo ${xyz} => 123
我想打印所有这些,了解内存中添加了什么,这样我就可以将其清除。
答案1
如果您使用的是 Bash,此命令将列出所有不由子进程继承且不属于默认列表的 shell 变量的名称:
diff -U 1 <(set -o posix ; set |cut -d= -f1) <(exec bash -ic 'set -o posix ; set' | cut -d= -f1)|grep '^[-][^-]'|cut -d- -f2|grep -vE '^(COLUMNS|HISTFILESIZE|HISTSIZE|LINES|PIPESTATUS)$'
这会生成当前 shell 中所有变量名称的列表(其中set
),以及运行同一 shell 的新创建的子进程中所有变量名称的列表,查找第一个列表中存在的所有变量名称,而不是第二个列表中存在的变量名称(使用diff
、最后一次剪切和第一次 grep),并删除子进程不会有的一些特定于 Bash 的默认变量,因为它不是面向用户的 shell。set -o posix
使得set
仅列出变量而不列出函数。
它将省略两个都继承的环境变量和您明确标记为导出的变量。
换掉bash
你的外壳。您还需要更改最后一个被忽略变量的列表grep
,并且可能会丢失set -o posix
。如果你的外壳没有流程替代,您需要改用临时文件,或对文件描述符的特定于平台的访问(如/dev/fd
)。
另一方面,如果您只想清除自己的局部变量和函数,那么
exec bash
将会产生这种效果(同时还会重新读取一些配置文件并可能丢失对 shell 选项的本地更改)。