Krátce:set můžete vidět místní proměnné shellu, env nelze.
Shelly mohou mít proměnné 2 typů:locals, které jsou dostupné pouze z aktuálního shellu, a (exportované) proměnné prostředí, které jsou předány každému spuštěnému programu.
Od set je vestavěný příkaz shell, vidí také místní proměnné shellu (včetně funkcí shellu). env na druhé straně je nezávislým spustitelným souborem; vidí pouze proměnné, které mu shell předá, nebo proměnné prostředí.
Když napíšete řádek jako a=1 pak se vytvoří lokální proměnná (pokud již v prostředí neexistovala). Proměnné prostředí se vytvářejí pomocí export a=1
Pokud chcete omezit výstup set příkaz pouze pro proměnné, můžete jej spustit v režimu POSIX:
type -a env set
help set
(set -o posix; set) | nl
Pokud potřebujete jemnější kontrolu nad výpisem konkrétních proměnných, můžete použít vestavěné funkce Bash, jako je declare nebo compgen , nebo nějaké další Bashovy triky.
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
set je vestavěný shell, zatímco env je program (/usr/bin/env)
set dělá několik věcí, ale sám o sobě uvádí proměnné prostředí. Může také nastavit/přepnout přepínače, jako je set +x nebo set -v atd.
env sám o sobě uvádí exportované proměnné prostředí, ale může spustit program v upraveném prostředí
Viz man 1 env pro více informací.