How do I see a list of all currently defined environment variables in a Linux bash terminal?

32

8

In a Linux bash terminal, there are often many environment variables that have been set, like $PATH and $HOME.

Is it possible to see all of the environment variables that have been set? How?

Cory Klein

Posted 2012-05-03T21:35:27.753

Reputation: 1 232

1http://askubuntu.com/questions/275965/how-to-list-all-variables-names-and-their-current-values – Ciro Santilli 新疆改造中心法轮功六四事件 – 2015-11-30T14:35:31.550

Answers

32

TL;DR: use (set -o posix ; set)


According to the Bash manual you can use the set built-in command to show all of the environment variables that have been set. The set command will also display the definitions of any functions. If you only want to see the variables, and not the functions, then you can turn on POSIX mode before running the set command. The easiest way to do that is with set -o posix, but that will leave POSIX mode on until you turn it off with set +o posix.

Therefore, the following command will show all of the defined environment variables by using a subshell without affecting POSIX compliance in your current shell.

(set -o posix ; set)

@RedGrittyBrick and @iglvzx suggested using the env command, however this command will not provide a complete listing of environment variables. env will only show the varaibles that have been marked for export. Compare the output of env | sort and export -p and you will see what I mean. You can run comm -23 <(set -o posix; set) <(env|sort) if you want to see which environment variables are not being exported.

The reason for the discrepancy is that env is a separate executable as opposed to set which is a shell built-in command. According to the Bash manual, when a command is executed that is not a shell built-in command or function it will only receive environment variables that have been marked for export in Bash. There are many variables that are not exported. Therefore, if you wish to see all of the variables that your shell has defined, you must use the set command as stated in the manual.

You can easily test this behavior for yourself using the following commands.

MY_TEST_VARIABLE="This is my test variable."
set | grep MY_TEST_VARIABLE
env | grep MY_TEST_VARIABLE

You will see that set provides output while env does not.

Starfish

Posted 2012-05-03T21:35:27.753

Reputation: 838

25

The env command with no arguments will print a list of the "exported" environment variables and their values. These variables are made visible to subprocesses - many other environment variables are not shown with this, and used inside the running shell only, eg for configuration.

RedGrittyBrick

Posted 2012-05-03T21:35:27.753

Reputation: 70 632

4@Starfish is right - that means this accepted answer was very wrong. Edited to say it's listing exported variables only. – Volker Siegel – 2014-07-01T00:12:06.177

Why isn't this the top answer. It's so much simpler and more memorable. – stevec – 2020-01-25T08:39:30.400

10I prefer printenv, since both env and set have other functions than just outputting the environment. – iglvzx – 2012-05-04T05:04:26.347

3env will only print a list of environment variables that have been marked for export. It will not print all variables. – Starfish – 2013-09-07T05:19:04.120

12

compgen -v

prints shell variables (but not the values).

compgen -e

prints exported variables i.e. those that get inherited by processes this shell starts (but not their values).

Difference between shell and exported variables: https://unix.stackexchange.com/questions/3507/difference-between-environment-variables-and-exported-environment-variables-in-b?rq=1

Evgeni Sergeev

Posted 2012-05-03T21:35:27.753

Reputation: 1 704

compgen -e is exactly what I wanted! – hao – 2019-06-03T06:09:29.877

1

I arrived here from a search for how to order the output of env alphabetically; it's quite simple

env | sort

stevec

Posted 2012-05-03T21:35:27.753

Reputation: 113