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.