If you're using Bash, this command will list the names of all shell variables that are not inherited by a child process and not part of the default slate:
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)$'
This produces a list of all variable names in the current shell (with
set), and a list of all variable names in a newly-created subprocess running the same shell, finds all those present in the first list and not the second (with
diff, the last cut, and the first grep), and trims out some Bash-specific default variables that the subprocess won't have because it's not a user-facing shell.
set -o posix makes
set list only the variables and not functions.
It will omit both inherited environment variables and variables you've explicitly marked for export.
bash for your shell. You'll also need to change the list of ignored variables in the last
grep, and can probably lose
set -o posix. If your shell doesn't have process substitution, you'll need to use temporary files instead, or platform-specific access to file descriptors (like
On the other hand, if all you want to do is clear out your own local variables and functions then
will have that effect (while also re-reading some configuration files and potentially losing local changes to shell options).