Per farla breve:set
può vedere le variabili locali della shell, env
non può.
Le shell possono avere variabili di 2 tipi:locali, che sono accessibili solo dalla shell corrente, e variabili di ambiente (esportate), che vengono passate a ogni programma eseguito.
Dal set
è un integrato comando shell, vede anche le variabili locali della shell (comprese le funzioni della shell). env
d'altra parte è un eseguibile indipendente; vede solo le variabili che la shell gli passa, o le variabili d'ambiente.
Quando digiti una riga come a=1
quindi viene creata una variabile locale (a meno che non esistesse già nell'ambiente). Le variabili d'ambiente vengono create con export a=1
Se vuoi limitare l'output di set
comando solo alle variabili, puoi eseguirlo in modalità POSIX:
type -a env set
help set
(set -o posix; set) | nl
Se hai bisogno di un controllo più preciso sull'elenco di variabili specifiche, puoi utilizzare i built-in di Bash come declare
o compgen
, o altri trucchi di Bash.
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
è un built-in della shell, mentre env
è un programma (/usr/bin/env)
set
fa diverse cose, ma da solo elenca le variabili d'ambiente. Può anche impostare/commutare interruttori, come set +x
o set -v
ecc.
env
da solo elenca gli elementi esportati variabili di ambiente, ma può eseguire un programma in un ambiente modificato
Vedi man 1 env
per ulteriori informazioni.