I get similar results running "env" and "set". Set gives more results - is it a superset of env?
The man page for set doesn't give any information. How do these commands work and what's the difference?
env executes utility after modifying the environment as specified on the command line. Each name=value option specifies the setting of an environment vari- able, name, with a value of value. All such environment variables are set before the utility is executed.
env is a shell command for Linux, Unix, and Unix-like operating systems. It can print a list of the current environment variables, or to run another program in a custom environment without modifying the current one.
The difference between printenv and env command is that they have their own unique feature. For printenv , we can ask it to give value of a particular environment variable. For env , it has more function — set environment and execute command.
Long story short: set
can see shell-local variables, env
cannot.
Shells can have variables of 2 types: locals, which are only accessible from the current shell, and (exported) environment variables, which are passed on to every executed program.
Since set
is a built-in shell command, it also sees shell-local variables (including shell functions). env
on the other hand is an independent executable; it only sees the variables that the shell passes to it, or environment variables.
When you type a line like a=1
then a local variable is created (unless it already existed in the environment). Environment variables are created with export a=1
If you want to limit the output of the set
command to variables only, you may run it in POSIX mode:
type -a env set help set (set -o posix; set) | nl
If you need finer control over listing specific variables, you may use Bash builtins such as declare
or compgen
, or some other Bash tricks.
man bash | less -p '-A action$' # info on complete & compgen # listing names of variables compgen -A variable | nl # list names of all shell variables echo ${!P*} # list names of all variables beginning with P compgen -A export | nl # list names of exported shell variables export | nl # same, plus always OLDPWD declare -px | nl # same declare -pr # list readonly variables # listing names of functions compgen -A function | nl declare -F | nl declare -Fx | nl # show code of specified function myfunc() { echo 'Hello, world!'; return 0; } declare -f myfunc
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With