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í.