2010-12-01 3 views
9

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 
+0

Pourquoi ne pas '#!/Bin/sh -eux' dans' Y.sh'? – khachik

+0

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

+1

Modifications de X et Y ne sont pas possibles, parce qu'ils ne sont pas à moi – krvladislav

Répondre

14

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.

+0

C'est sympa, merci, Shawn! – krvladislav

+0

De rien. –

+0

une idée de fonction similaire dans '/ bin/sh' (sur un système embarqué avec seulement busybox/bin/sh). – nhed

0

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 
+0

il est préférable d'ajouter echo -n> $ out; echo -n> $ err avant sh – krvladislav