Pour faire court :set
peut voir les variables locales du shell, env
ne peut pas.
Les shells peuvent avoir des variables de 2 types :les locales, qui ne sont accessibles qu'à partir du shell actuel, et les variables d'environnement (exportées), qui sont transmises à chaque programme exécuté.
Depuis set
est un intégré shell, il voit également les variables locales du shell (y compris les fonctions du shell). env
d'autre part est un exécutable indépendant; il ne voit que les variables que le shell lui transmet, ou les variables d'environnement.
Lorsque vous tapez une ligne comme a=1
alors une variable locale est créée (sauf si elle existait déjà dans l'environnement). Les variables d'environnement sont créées avec export a=1
Si vous souhaitez limiter la sortie du set
commande aux variables uniquement, vous pouvez l'exécuter en mode POSIX :
type -a env set
help set
(set -o posix; set) | nl
Si vous avez besoin d'un contrôle plus précis sur la liste des variables spécifiques, vous pouvez utiliser les fonctions intégrées de Bash telles que declare
ou compgen
, ou d'autres astuces de 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
est un shell intégré, tandis que env
est un programme (/usr/bin/env)
set
fait plusieurs choses, mais par lui-même, il répertorie les variables d'environnement. Il peut également définir/basculer des commutateurs, tels que set +x
ou set -v
etc.
env
par lui-même répertorie les exportés variables d'environnement, mais peut exécuter un programme dans un environnement modifié
Voir man 1 env
pour plus d'informations.