¿Cómo puedo ejecutar scripts de shell anidados con la misma opción? Por ejemplo,
parent.sh
#!/bin/sh ./child.sh
child.sh
#!/bin/sh ls
¿Cómo puedo modificar parent.sh
para que cuando lo ejecute con sh -x parent.sh
, la opción -x
también sea efectiva en child.sh
y la ejecución de ls
se muestre en mi consola?
Estoy buscando una solución portátil que sea efectiva para situaciones excepcionales, como usuarios del sistema con /bin/false
como shell registrado. ¿Será de alguna ayuda la variable de entorno $SHELL
?
Aclaración: a veces quiero llamar a parent.sh
con -x
, a veces con -e
, dependiendo de la situación. Entonces, la solución no debe implicar codificar las banderas.
Si usa bash
, puedo recomendar lo siguiente:
#!/bin/bash export SHELLOPTS ./child.sh
Puede propagar tantas veces como necesite, también puede usar echo $SHELLOPTS
en cada secuencia de comandos en la línea para ver qué está sucediendo y cómo se propagan las opciones si necesita comprenderlo mejor.
Pero para /bin/sh
fallará con /bin/sh: SHELLOPTS: readonly variable
de solo lectura debido a cómo se aplica POSIX en /bin/sh
en varios sistemas, más información aquí: https://lists.gnu.org/archive/ html/bug-bash/2011-10/msg00052.html
parece un truco y parece que no es la mejor manera.
Pero hará exactamente lo que quieras.
Una de las formas en que puede hacerlo es crear alias para crear envoltorios para sh
:
alias saveShell='cp /bin/sh $some_safe_place' alias shx='cp $some_safe_place /bin/x_sh; rm /bin/sh; echo "/bin/x_sh -x $@" > /bin/sh; chmod 755 /bin/sh ' alias she='cp $some_safe_place /bin/e_sh; rm /bin/sh; echo "/bin/e_sh -e $@" > /bin/sh; chmod 755 /bin/sh ' alias restoreShell='cp $some_safe_place /bin/sh'
Cómo utilizar:
ejecute saveShell
y luego use shx
o she
, si cambiaría -x
por -e
, ejecute restoreShell
y luego ejecute shx
o she
ejecute el script como de costumbre sh ./parent.sh
TENGA MUCHO CUIDADO CON EL MOVIMIENTO DE SH
Otra solución reemplaza #!/bin/sh
a #!/bin/sh -x
o #!/bin/sh -e
con sed
en todos los archivos sh antes de ejecutar el script.