¿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.