POSIXly, você pode fazer:
# save
export -p > saved-env
...
# restore
blacklisted () {
case $1 in
PWD|OLDPWD|SHELL|STORAGE|-*) return 0 ;;
*) return 1 ;;
esac
}
eval '
export() {
blacklisted "${1%%=*}" || unset -v "${1%%=*}"
}
'"$(export -p)"
export() {
blacklisted "${1%%=*}" || command export "$@"
}
. saved-env
unset -f export
Observe que, para bash
não chamado como sh
, você precisará emitir set -o posix
para que funcione corretamente. Também com bash
versões anteriores a 4.4, o fornecimento da saída de export -p
é potencialmente inseguro:
$ env -i 'a;reboot;=1' /bin/bash -o posix -c 'export -p'
export OLDPWD
export PWD="/"
export SHLVL="1"
export a;reboot;
O ksh93 tem um problema semelhante. yash
não tem aquele em particular, mas ainda tem problemas com nomes de variáveis que começam com -
:
$ env -i -- '-p=' yash -c 'export -p'
export '-p'=''
export OLDPWD
export PWD='/'
Tenha também cuidado com possíveis problemas se você não estiver na mesma localidade ao salvar e restaurar as variáveis.
bash-4.3$ locale charmap
ISO-8859-15
bash-4.3$ export Stéphane=1
bash-4.3$ export -p > a
bash-4.3$ LC_ALL=en_GB.UTF-8 bash -c '. ./a'
./a: line 5: export: 'Stéphane=1': not a valid identifier