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 -$-"
oldstate=$(set +o)
c'est un moyen plus simple (et POSIX) de stocker toutes les options.pdksh
/mksh
(et autres dérivés de pdksh) ouzsh
pour lesset +o
sorties uniquement les écarts par rapport aux paramètres par défaut. Cela fonctionnerait pour bash / dash / yash mais ne serait pas portable.Vous pouvez lire la
$-
variable au début pour voir si elle-x
est définie ou non, puis l'enregistrer dans une variable, par exempleDu manuel de Bash :
la source
Dans bash, $ SHELLOPTS est défini avec les drapeaux activés. Vérifiez-le avant d'allumer xtrace, et réinitialisez xtrace uniquement s'il était éteint auparavant.
la source
Juste pour énoncer l'évidence, si
set -x
doit être en vigueur pendant la durée du script et qu'il ne s'agit que d'une mesure de test temporaire (ne faisant pas partie intégrante de la sortie), vous pouvez soit appeler le script avec l'-x
option, par exemple,... ou modifiez temporairement le script (première ligne) pour activer la sortie de débogage en ajoutant l'
-x
option suivante:Je réalise que c'est probablement un trait trop large pour ce que vous voulez, mais c'est le moyen le plus simple et le plus rapide d'activer / désactiver, sans trop compliquer le script avec des éléments temporaires que vous voudrez probablement supprimer de toute façon (d'après mon expérience).
la source
Ceci fournit des fonctions pour enregistrer et restaurer les indicateurs visibles via le
$-
paramètre spécial POSIX . Nous utilisons l'local
extension pour les variables locales. Dans un script portable conforme à POSIX, les variables globales seraient utilisées (pas delocal
mot clé):Ceci est utilisé de la même manière que la façon dont les indicateurs d'interruption sont sauvegardés et restaurés dans le noyau Linux:
Cela ne fonctionnera pour aucune des options étendues qui ne sont pas couvertes par la
$-
variable.Je viens de remarquer que POSIX a ce que je cherchais: l'
+o
argument deset
n'est pas une option, mais une commande qui vide un tas de commandes qui, sieval
elles sont restaurées, restaurent les options. Alors:C'est ça.
Un petit problème est que si l'
-x
option est activée avant celaeval
, une multitude deset -o
commandes est vue. Pour éliminer cela, nous pouvons procéder comme suit:la source
Vous pouvez utiliser un sous-shell.
la source
Semblable à ce que @Jeff Shaller a dit mais réglé pour NE PAS faire écho à cette partie au milieu (ce dont j'avais besoin):
la source