如何打印所有非环境变量?

如何打印所有非环境变量?

如何打印所有非环境变量?

这些是我从 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 选项的本地更改)。

相关内容