Abstrait
Pour inverser un, set -x
exécutez simplement un set +x
. La plupart du temps, l'inverse d'une chaîne set -str
est la même chaîne avec +
: set +str
.
En général, pour restaurer toutes errexit
les options du shell (modifiées ci-dessous à l' aide de la set
commande) (lisez ci-dessous à propos de bash shopt
), procédez comme suit (lisez également ci-dessous les options de bash ):
oldstate="$(set +o); set -$-" # POSIXly store all set options.
.
.
set -vx; eval "$oldstate" # restore all options stored.
Description plus longue
frapper
Cette commande:
shopt -po xtrace
générera une chaîne exécutable qui reflète l'état de l'option. L' p
indicateur signifie imprimer et il o
indique que nous posons des questions sur les options définies par la set
commande (par opposition aux options définies par la shopt
commande). Vous pouvez affecter cette chaîne à une variable et l'exécuter à la fin de votre script pour restaurer l'état initial.
# store state of xtrace option.
tracestate="$(shopt -po xtrace)"
# change xtrace as needed
echo "some commands with xtrace as externally selected"
set -x
echo "some commands with xtrace set"
# restore the value of xtrace to its original value.
eval "$tracestate"
Cette solution fonctionne pour plusieurs options simultanément:
oldstate="$(shopt -po xtrace noglob errexit)"
# change options as needed
set -x
set +x
set -f
set -e
set -x
# restore to recorded state:
set +vx; eval "$oldstate"
L'ajout set +vx
évite l'impression d'une longue liste d'options.
Et, si vous ne listez aucun nom d'option,
oldstate="$(shopt -po)"
il vous donne les valeurs de toutes les options. Et, si vous laissez le o
drapeau de côté, vous pouvez faire la même chose avec des shopt
options:
# store state of dotglob option.
dglobstate="$(shopt -p dotglob)"
# store state of all options.
oldstate="$(shopt -p)"
Si vous devez vérifier si une set
option est définie, le moyen le plus idiomatique (Bash) de le faire est:
[[ -o xtrace ]]
qui est meilleur que les deux autres tests similaires:
[[ $- =~ x ]]
[[ $- == *x* ]]
Avec n'importe lequel des tests, cela fonctionne:
# record the state of the xtrace option in ts (tracestate):
[ -o xtrace ] && ts='set -x' || ts='set +x'
# change xtrace as needed
echo "some commands with xtrace as externally selected"
set -x
echo "some commands with xtrace set"
# set the xtrace option back to what it was.
eval "$ts"
Voici comment tester l'état d'une shopt
option:
if shopt -q dotglob
then
# dotglob is set, so “echo .* *” would list the dot files twice.
echo *
else
# dotglob is not set. Warning: the below will list “.” and “..”.
echo .* *
fi
POSIX
Une solution simple et compatible POSIX pour stocker toutes les set
options est la suivante:
set +o
qui est décrit dans la norme POSIX comme:
+ o
Ecrivez les paramètres d’option actuels dans la sortie standard dans un format adapté pour être réintroduit dans le shell en tant que commandes réalisant les mêmes paramètres d’option.
Alors, simplement:
oldstate=$(set +o)
conservera les valeurs pour toutes les options définies à l'aide de la set
commande.
Encore une fois, restaurer les options à leurs valeurs d'origine consiste à exécuter la variable:
set +vx; eval "$oldstate"
Ceci est exactement équivalent à l'utilisation de Bash shopt -po
. Notez que cela ne couvrira pas toutes les options possibles de Bash , car certaines sont définies par shopt
.
cas spécial bash
Il y a beaucoup d'autres options de shell listées avec shopt
dans bash:
$ shopt
autocd off
cdable_vars off
cdspell off
checkhash off
checkjobs off
checkwinsize on
cmdhist on
compat31 off
compat32 off
compat40 off
compat41 off
compat42 off
compat43 off
complete_fullquote on
direxpand off
dirspell off
dotglob off
execfail off
expand_aliases on
extdebug off
extglob off
extquote on
failglob off
force_fignore on
globasciiranges off
globstar on
gnu_errfmt off
histappend on
histreedit off
histverify on
hostcomplete on
huponexit off
inherit_errexit off
interactive_comments on
lastpipe on
lithist off
login_shell off
mailwarn off
no_empty_cmd_completion off
nocaseglob off
nocasematch off
nullglob off
progcomp on
promptvars on
restricted_shell off
shift_verbose off
sourcepath on
xpg_echo off
Ceux-ci pourraient être ajoutés à la variable définie ci-dessus et restaurés de la même manière:
$ oldstate="$oldstate;$(shopt -p)"
.
. # change options as needed.
.
$ eval "$oldstate"
Il est possible de faire (le $-
est ajouté pour assurer sa errexit
conservation):
oldstate="$(shopt -po; shopt -p); set -$-"
set +vx; eval "$oldstate" # use to restore all options.
Remarque : chaque shell a une manière légèrement différente de construire la liste des options définies ou non définies (pour ne pas mentionner différentes options définies), de sorte que les chaînes ne sont pas portables entre les shells, mais sont valides pour le même shell.
cas spécial zsh
zsh
fonctionne également correctement (suivant POSIX) depuis la version 5.3. Dans les versions précédentes , il a suivi que partiellement Posix set +o
en ce qu'elle imprime des options dans un format qui a été adapté pour Reinput à la coquille sous forme de commandes, mais seulement pour fixer les options (il n'a pas imprimer un-ensemble des options).
cas particulier de mksh
Le mksh (et par conséquent lksh) n'est pas encore capable (MIRBSD KSH R54 2016/11/11) de le faire. Le manuel mksh contient ceci:
Dans une version ultérieure, set + o se comportera de manière conforme à POSIX et imprimera des commandes pour restaurer les options en cours.
set -e cas particulier
Dans bash, la valeur de set -e
( errexit
) est réinitialisée à l'intérieur des sous-coquilles, ce qui rend difficile la capture de sa valeur à l' set +o
intérieur d'un sous-shell $ (…).
Pour contourner le problème, utilisez:
oldstate="$(set +o); set -$-"