¿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
¿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
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.
¡Es bueno, gracias, Shawn! – krvladislav
Eres bienvenido. –
cualquier idea para funciones similares en '/ bin/sh' (en el sistema integrado con solo busybox/bin/sh). – nhed
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
es mejor agregar echo -n> $ out; echo -n> $ err antes de sh – krvladislav
Por qué no '#/bin/sh -eux' en' Y.sh'? – khachik
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
Las modificaciones de X e Y no son posibles, porque no son mías – krvladislav