Existe-t-il un moyen d'exécuter le script bash X de sorte que si X appelle le script bash exécutable Y alors Y commence par 'sh -eux'?bash recursive xtrace
X.sh:
./Y.sh
Y.sh:
#!/bin/sh
echo OK
Existe-t-il un moyen d'exécuter le script bash X de sorte que si X appelle le script bash exécutable Y alors Y commence par 'sh -eux'?bash recursive xtrace
X.sh:
./Y.sh
Y.sh:
#!/bin/sh
echo OK
Il est possible de faire une course de sous-shell en utilisant les mêmes options shell définies dans le parent en exportant la variable d'environnement SHELLOPTS
.
Dans votre cas où X.sh
et Y.sh
ne peut pas être modifié, je créer un script d'emballage qui exporte simplement SHELLOPTS
avant d'appeler X.sh
.
Exemple:
#!/bin/sh
# example X.sh which calls Y.sh
./Y.sh
.
#!/bin/sh
# example Y.sh which needs to be called using sh -eux
echo $SHELLOPTS
.
#!/bin/sh -eux
# wrapper.sh which sets the options for all sub shells
export SHELLOPTS
./X.sh
Appel X.sh
montre directement que -eux
options ne sont pas définies dans Y.sh
[[email protected]]$ ./X.sh
braceexpand:hashall:interactive-comments:posix
appel via wrapper.sh
montre que les options ont propagé aux sous-couches.
[[email protected]]$ ./wrapper.sh
+ export SHELLOPTS
+ ./x.sh
+ ./y.sh
+ echo braceexpand:errexit:hashall:interactive-comments:nounset:posix:xtrace
braceexpand:errexit:hashall:interactive-comments:nounset:posix:xtrace
testées sur bash GNU version 3.00.15 (1) -release. YMMV.
C'est sympa, merci, Shawn! – krvladislav
De rien. –
une idée de fonction similaire dans '/ bin/sh' (sur un système embarqué avec seulement busybox/bin/sh). – nhed
donc j'ai outil pour les scripts shell de débogage:
#!/bin/sh
# this tool allows to get full xtrace of any shell script execution
# only argument is script name
out=out.$1
err=err.$1
tmp=tmp.$1
echo "export SHELLOPTS; sh [email protected] 1>> $out 2>> $err" > $tmp
sh -eux $tmp &> /dev/null
rm $tmp
il est préférable d'ajouter echo -n> $ out; echo -n> $ err avant sh – krvladislav
Pourquoi ne pas '#!/Bin/sh -eux' dans' Y.sh'? – khachik
Et si parfois vous devez exécuter Y.sh sans cela, créez un wrapper pour Y.sh qui l'invoque de cette façon et utilisez toujours le wrapper dans X.sh. – Sorpigal
Modifications de X et Y ne sont pas possibles, parce qu'ils ne sont pas à moi – krvladislav