Comment savoir si le script bash en cours d'exécution a été appelé avec -x pour le debugging?

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.