Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the difference between "env" and "set" (on Mac OS X or Linux)? [closed]

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?

like image 593
stupakov Avatar asked Apr 13 '11 23:04

stupakov


People also ask

What does env command do in Mac?

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.

What does env mean in Linux?

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.

What is the difference between env and Printenv?

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.


2 Answers

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

like image 197
intgr Avatar answered Sep 23 '22 11:09

intgr


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   
like image 20
tim Avatar answered Sep 23 '22 11:09

tim