Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/11/2017, à 16:17

Arbiel

[Résolu] Redirection trace d'exécution de "set -o xtrace;"

Bonjour

Je voudrais rediriger la trace d'exécution d'un script. La commande

set -o xtrace 1>/tmp/trace

laisse la trace s'afficher sur le terminal, comme la commande

set -o xtrace 2>/tmp/trace

Merci d'avance à quiconque pourra m'indiquer comment faire.

Arbiel

Dernière modification par Arbiel (Le 23/11/2017, à 20:20)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#2 Le 23/11/2017, à 18:53

pingouinux

Re : [Résolu] Redirection trace d'exécution de "set -o xtrace;"

Bonjour,
Tu peux faire débuter ton script ainsi :

#!/bin/bash
exec 2>/tmp/trace
set -x

Hors ligne

#3 Le 23/11/2017, à 20:19

Arbiel

Re : [Résolu] Redirection trace d'exécution de "set -o xtrace;"

Bonsoir

Ta proposition ne fonctionne pas, mais elle a contribué à me faire trouver la solution ici

Voila ce qui fonctionne

	function test {
		gbl_test=true;
		exec 6> /tmp/xtrace
		export BASH_XTRACEFD=6
		set -o xtrace
		"${@}";
		set +o xtrace
	}

compte tenu du fait que j'écris tout sous forme de fonctions et que je lance les exécutions par

nom_du_script [test] fonction paramètres

Merci pour ton aide.

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#4 Le 23/11/2017, à 20:25

pingouinux

Re : [Résolu] Redirection trace d'exécution de "set -o xtrace;"

Arbiel a écrit :

Ta proposition ne fonctionne pas

Je l'avais pourtant testée dans un petit script, mais sans fonction.

Hors ligne

#5 Le 23/11/2017, à 21:50

Arbiel

Re : [Résolu] Redirection trace d'exécution de "set -o xtrace;"

La différence peut provenir de la variable BASH_XTRACEFD qui, chez moi, n'est pas définie au démarrage.


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#6 Le 23/11/2017, à 21:59

pingouinux

Re : [Résolu] Redirection trace d'exécution de "set -o xtrace;"

Arbiel a écrit :

La différence peut provenir de la variable BASH_XTRACEFD qui, chez moi, n'est pas définie au démarrage.

Chez moi non plus.

Hors ligne

#7 Le 23/11/2017, à 22:54

Arbiel

Re : [Résolu] Redirection trace d'exécution de "set -o xtrace;"

Peut-être

remi@remi-Vostro-3550:~$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
Licence GPLv3+ : GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
remi@remi-Vostro-3550:~$ 

Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#8 Le 23/11/2017, à 23:00

pingouinux

Re : [Résolu] Redirection trace d'exécution de "set -o xtrace;"

Nous avons la même version. Pourrais-tu montrer un bout du script qui posait problème, pour que je teste ?

Hors ligne

#9 Le 24/11/2017, à 13:12

kholo

Re : [Résolu] Redirection trace d'exécution de "set -o xtrace;"

salut,
je suis...

pour pointer un script et le déboguer, j'utilise la variable $LINENO
qui donne la ligne exécutée dans le code
par exemple entre chaque fonction, je met

echo "chargement ligne $LINENO"

pour avoir un retour de l'avancement d'un chargement et pointer certains problèmes
tu peux aussi ajouter dans le code une sortie de valeur et autres infos

echo "ligne $LINENO : ma_variable = $ma_variable" >>/tmp/log

puis mettre en commentaire tout ou partie des lignes contenant $LINENO
...

Hors ligne

#10 Le 24/11/2017, à 20:01

Arbiel

Re : [Résolu] Redirection trace d'exécution de "set -o xtrace;"

Bonsoir

@pingouinux
Je pense que nous pouvons abandonner. Le script ci-dessous et l'exécution que j'en ai faite montrent que les lignes que tu m'as proposées fonctionnent parfaitement, contrairement à mon constat initial.

Les fonctions qui mettent en œuvre la trace se trouvent à la fin du script.

#! /bin/bash

#############################################################
# calcul des permutations des termes passés en paramètres
##############################################################
# procédure récursive : 
# les permutations de "a b c" s'obtiennent par le calcul de toutes les permutations de "b c" ("b c" et "c b"), 
# puis l'ajout de "a" à chacune des places possibles, devant, au milieu (entre b et c de "b c" et de "c b")
# et en dernière position ce qui donne
# "a b c", "a c b", "b a c", "c a b", "b c a" et "c b a",
# c'est-à-dire les 6 permutations possibles.
# Lors de la construction des permutations, en insère "-" entre les éléments des permutations et on sépare les permutations par un " "
# En fin de création des permutations de "b c", en remplace les "-" par des "|" pour permettre l'insertion de "a" aux places qui conviennent.
# Le résultat de la fonction est le retour du plus haut niveau, composé des permutations séparées les unes des autres par un " ",
# chaque permutation étant composée elle-même des éléments séparés par une barre verticale "|".
#
# Les caractères " ", "-" et "|" ne doivent pas apparaître dans les éléments consitutifs des permutations.
#
	function permut {
		local x="";
		local l="";
		local ne="${1}";
		if [[ $((${#})) -eq 1 ]]; then
# lorsque le dernier élément est atteint, on en retourne la valeur pour lancer la constitution des permutations
			l="${1}" ;
		else
# créer toutes les permutations de rang immédiatement inférieur après retrait du premier élément mémoriser dans ${ne}
			shift;
# récursivité : 
			for x in $(permut "${@}"); do
# créer deux nouveaux éléments, un avec le premier élément réintroduit en tête, l'autre avec le premier élément réintroduit en queue
				l="${l} ${ne}-${x} ${x}-${ne}";
# jusqu'à ce qu'il n'y ait plus de | dans la suite rendue par le niveau inférieur
				until [[ "${x}" = "${x%|*}" ]]; do
# introduire dans les permutations une nouvelle permutation en remplaçant successivement chaque occurrence de | par le nouvel élément
					l="${l} ${x/|/-${ne}-}";
# remplacer la première | par un - pour reculer l'insertion du premier élément dans la permutation à suivre
					x="${x/|/-}"
					done;
				done;
# réinsérer des | dans toutes les permutations pour le niveau supérieur
			l=${l//-/|};
		fi;
	echo "${l}"
	};
#############################################################
# calcul des combinaisons, autres que la combinaison vide, des éléments d'un ensemble
##############################################################
# procédure récursive :
# La création de toutes les combinaisons de "a b c", s'obtient par l'ajout en tête de la liste
# des combinaisons de b et c, "b"  "b-c" "c"
# d'une part, d'une première combinaison avec le nouvel élément seul, puis,
# d'autre part, de chacune des combinaisons de la liste courante dans lesquelles on ajoute en tête le nouvel élément.
# La nouvelle liste est ainsi constituée de toutes les combinaisons possibles, à savoir
# "a" "a-b" "a-b-c" "a-c" "b" "b-c" "c".
	function combinaisons {
		local al;
		local ne="${1}";
		if [[ $((${#})) -le 1 ]]; then
			l="${1}" ;
		else
			shift 1;
			al="$(combinaisons "${@}")";
			l="${ne} ${l}";
			for elem in ${al}; do
# ajouter à la liste une combinaison contenant le nouvel élément en plus des éléments précédents
				l="${l} ${ne}-${elem}";
				done;
			l="${l} ${al}"
		fi;
	echo "${l}"
	}	
##########################################################################
# Fonction pour la réalisation de tests, la procédure à tester est donnée en paramètre
###########################################################################
	function test_export {
		Gbl_dir_ucg=$(mktemp -d --suffix=".dir") ;
		exec 2> ${Gbl_dir_ucg}/xtrace
		export BASH_XTRACEFD=2
		set -x
		"${@}";
		set +x
		ls -l ${Gbl_dir_ucg}/xtrace
	}
		function test_seto {
		Gbl_dir_ucg=$(mktemp -d --suffix=".dir") ;
		exec 2> ${Gbl_dir_ucg}/xtrace
		set -o xtrace
		"${@}";
		set +o xtrace
		ls -l ${Gbl_dir_ucg}/xtrace
	}
		function test_setx {
		Gbl_dir_ucg=$(mktemp -d --suffix=".dir") ;
		exec 2> ${Gbl_dir_ucg}/xtrace
		set -x
		"${@}";
		set +x
		ls -l ${Gbl_dir_ucg}/xtrace
	}

	test_setx permut a b c
	test_seto permut d e f
	test_export permut g h i

L'exécution donne ceci :

remi@remi-Vostro-3550:~$ ~/Bureau/pingouinux a|b|c b|c|a b|a|c a|c|b c|b|a c|a|b
-rw-rw-r-- 1 remi remi 715 nov.  24 18:43 /tmp/tmp.7t71FVRuew.dir/xtrace
 d|e|f e|f|d e|d|f d|f|e f|e|d f|d|e
-rw-rw-r-- 1 remi remi 722 nov.  24 18:43 /tmp/tmp.mbiQzOFmCK.dir/xtrace
 g|h|i h|i|g h|g|i g|i|h i|h|g i|g|h
-rw-rw-r-- 1 remi remi 715 nov.  24 18:43 /tmp/tmp.4IcwXMdCtD.dir/xtrace
remi@remi-Vostro-3550:~$ 

Je suis incapable de retrouver comment j'ai pu me prendre les pieds dans le tapis lorsque j'ai recopié les lignes que tu m'as proposées.
La différence de longueur des fichiers tient à la commande qui ferme la trace, "set +x" ou "set +o xtrace".

@kholo
Oui, c'est une bonne idée, mais j'ai l'impression qu'elle fait double emploi avec la trace, qui, elle, me paraît plus simple à mettre en œuvre. Bien sûr la trace ne donne pas le numéro de ligne, mais elle permet de suivre pas à pas le déroulement du script. D'où ma question pour récupérer cette trace dans un fichier.

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne