2010-12-01 16 views
9

¿Hay alguna manera de ejecutar script bash X de modo que si X llama ejecutable script bash Y entonces Y comienza por 'sh -eux'?bash recursivo xtrace

X.sh:

./Y.sh 

Y.sh:

#!/bin/sh 
echo OK 
+0

Por qué no '#/bin/sh -eux' en' Y.sh'? – khachik

+0

Y si a veces debe ejecutar Y.sh sin esto, cree un contenedor para Y.sh que lo invoque de esta manera y siempre use el contenedor en X.sh. – Sorpigal

+1

Las modificaciones de X e Y no son posibles, porque no son mías – krvladislav

Respuesta

14

Es posible hacer una carrera subcapa usando las mismas opciones de concha establecidos en la matriz mediante la exportación de la variable de entorno SHELLOPTS.

En el caso en el que X.sh y Y.sh no se pueden editar, me gustaría crear un guión envoltorio que simplemente se exporta SHELLOPTS antes de llamar X.sh.

Ejemplo:

#!/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 

Calling X.sh muestra directamente que -eux opciones no están escritas en Y.sh

[[email protected]]$ ./X.sh 
braceexpand:hashall:interactive-comments:posix 

Llamarlo a través wrapper.sh muestra que las opciones se han propagado a los subniveles.

[[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 

probado en golpe GNU, versión 3.00.15 (1) -RELEASE. YMMV.

+0

¡Es bueno, gracias, Shawn! – krvladislav

+0

Eres bienvenido. –

+0

cualquier idea para funciones similares en '/ bin/sh' (en el sistema integrado con solo busybox/bin/sh). – nhed

0

así que tengo herramienta para depurar scripts de shell:

#!/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

es mejor agregar echo -n> $ out; echo -n> $ err antes de sh – krvladislav