J'ai un script launch.sh
qui s'exécute en tant launch.sh
user afin de créer des files avec le propriétaire correct. Je veux passer -x à cette invocation si elle a été passée au script
if [ `whoami` == "deployuser" ]; then ... bunch of commands that need files to be created as deployuser else echo "Respawning myself as the deployment user... #Inception" echo "Called with: <$BASH_ARGV>, <$BASH_EXECUTION_STRING>, <$->" sudo -u deployuser -H bash $0 "$@" # How to pass -x here if it was passed to the script initially? fi
J'ai lu la page de debugging de bash, mais il semble n'y avoir aucune option claire qui indique si le script original a été lancé avec -x
.
De nombreux indicateurs pouvant être transmis à bash
sur la command line sont des indicateurs. set
est le shell embedded qui peut basculer ces drapeaux au moment de l'exécution. Par exemple, appeler un script comme bash -x foo.sh
est fondamentalement le même que faire set -x
en haut du script.
Sachant que l' set
est le shell embedded responsable de cela nous permet de savoir où chercher. Maintenant, nous pouvons faire de l' help set
et nous obtenons ce qui suit:
$ help set set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...] ... -x Print commands and their arguments as they are executed. ... Using + rather than - causes these flags to be turned off. The flags can also be used upon invocation of the shell. The current set of flags may be found in $-. The remaining n ARGs are positional parameters and are assigned, in order, to $1, $2, .. $n. If no ARGs are given, all shell variables are printed. ...
Donc, à partir de cela, nous voyons que $-
devrait nous dire ce que les drapeaux sont activés.
$ bash -c 'echo $-' hBc $ bash -x -c 'echo $-' + echo hxBc hxBc
Donc, fondamentalement, vous avez juste besoin de faire:
if [[ "$-" = *"x"* ]]; then echo '`-x` is set' else echo '`-x` is not set' fi
En prime, si vous souhaitez copyr tous les drapeaux, vous pouvez également le faire
bash -$- /other/script.sh
set -o
produira xtrace on
si -x
est utilisé, sinon xtrace off
.
Bien que la réponse de @Pasortingck soit la bonne, vous pouvez également passer un paramètre ou une variable exscope dans votre script enfant qui lui indique quoi faire, comme activer le suivi.
Cela a l'inconvénient que (je crois) vous devez réexporter à chaque niveau de script que vous êtes sur le point d'entrer.
Il a l'avantage de pouvoir tracer sélectivement (ou autrement affecter) le (s) script (s) dont vous avez besoin du comportement de sortie / modifié de – pour réduire la sortie étrangère, etc. Par exemple, le traçage peut être désactivé pour le script appelant et toujours activé dans le script appelé. Ce n'est pas une proposition du tout ou rien.
Pas partie de votre question, mais liée:
Je définis parfois une variable comme
E="" E="echo "
ou
E="" E=": "
et l'utiliser (dans plusieurs déclarations) comme
"${E}" rsync ...
ou, juste pour la deuxième variation,
"${E}" echo "this is a debugging message"
Ensuite, je viens de commenter la deuxième définition quand je veux que les commands s'exécutent. Vous pouvez également utiliser cette technique avec un paramètre ou une variable exscope à la place.
Avec l'un ou l'autre de ces éléments, vous devez surveiller les instructions composées, car la méthode ne garantit que l'exécution de la première instruction dans la list composée.
Vous pouvez saisir le PID du process et ensuite examiner la table des process avec ps pour voir ce que ses arguments étaient.