Lange Rede kurzer Sinn:set
kann Shell-lokale Variablen sehen, env
nicht.
Shells können zwei Arten von Variablen haben:lokale, auf die nur von der aktuellen Shell aus zugegriffen werden kann, und (exportierte) Umgebungsvariablen, die an jedes ausgeführte Programm weitergegeben werden.
Seit set
ist eingebaut Shell-Befehl, sieht er auch Shell-lokale Variablen (einschließlich Shell-Funktionen). env
andererseits ist es eine unabhängige ausführbare Datei; es sieht nur die Variablen, die ihm die Shell übergibt, oder Umgebungsvariablen.
Wenn Sie eine Zeile wie a=1
eingeben dann wird eine lokale Variable erstellt (sofern sie nicht bereits in der Umgebung vorhanden ist). Umgebungsvariablen werden mit export a=1
erstellt
Wenn Sie die Ausgabe von set
einschränken möchten Befehl nur auf Variablen, Sie können ihn im POSIX-Modus ausführen:
type -a env set
help set
(set -o posix; set) | nl
Wenn Sie eine genauere Kontrolle über die Auflistung bestimmter Variablen benötigen, können Sie Bash-Builts wie declare
verwenden oder compgen
, oder einige andere 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
set
ist eine eingebaute Shell, während env
ist ein Programm (/usr/bin/env)
set
macht mehrere Dinge, listet aber selbst die Umgebungsvariablen auf. Es kann auch Schalter setzen/umschalten, wie z. B. set +x
oder set -v
usw.
env
selbst listet die exportierten auf Umgebungsvariablen, kann aber ein Programm in einer modifizierten Umgebung ausführen
Siehe man 1 env
für weitere Informationen.