Script shell Unix: transmettre les options du shell (-x, etc.) aux scripts nesteds

Comment puis-je exécuter des scripts shell nesteds avec la même option? Par exemple,

parent.sh

 #!/bin/sh ./child.sh 

child.sh

 #!/bin/sh ls 

Comment puis-je modifier parent.sh pour que lorsque je l’exécute avec sh -x parent.sh , l’option -x est également effective dans child.sh et l’exécution de ls est affichée sur ma console?

Je recherche une solution portable efficace pour les situations rares telles que les utilisateurs du système avec /bin/false comme shell enregistré. La variable d’environnement $SHELL sera-t-elle utile?

Clarification: je souhaite parfois appeler parent.sh avec -x , parfois avec -e , selon la situation. La solution ne doit donc pas impliquer un codage en dur des drapeaux.

Si vous utilisez bash , je peux recommander ce qui suit:

 #!/bin/bash export SHELLOPTS ./child.sh 

Vous pouvez propager autant de fois que nécessaire, vous pouvez également utiliser echo $SHELLOPTS dans chaque script pour voir ce qui se passe et comment les options sont propagées si vous avez besoin de mieux le comprendre.

Mais pour /bin/sh il échouera avec /bin/sh: SHELLOPTS: readonly variable cause de la façon dont POSIX est appliqué sur /bin/sh dans divers systèmes, plus d’informations ici: https://lists.gnu.org/archive/ html / bug-bash / 2011-10 / msg00052.html

ça ressemble à un hack et il semble que ce ne soit pas la meilleure façon.
Mais cela fera exactement ce que vous voulez

L’une des façons de procéder est de créer des alias pour créer des wrappers pour 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' 

Comment utiliser:
exécutez saveShell , puis utilisez shx ou she , si vous modifiez -x sur -e exécutez restoreShell , puis exécutez shx ou she exécute le script habituellement sh ./parent.sh

Soyez très attentif à votre déplacement SH

Autre solution: remplacez #!/bin/sh par #!/bin/sh -x ou #!/bin/sh -e avec sed dans tous les fichiers sh avant d’exécuter le script.