Bonjour,
Je commence à ma lancer un peu "sérieusement" dans les shell unix. Comprenez "au delà de juste lancer des commandes à l'arrache, j'essaie de de plus en plus d'architecturer mes scripts (fonction, gestion d'erreur, ...)"
Par exemple, pour garder des traces horodatées des commandes que je lance, plutôt que d'écrire à chaque fois un "echo date +....", j'ai pensé faire une fonction qui lance à la fois la commande et écrit les traces en même temps.
Bon alors, ça a l'air de fonctionner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #----------------------------------------- # Fonction qui exécute une ligne de commande passée en paramètre, en écrivant une ligne de trace horodatée, avant et après le lancement # # exemple : FN_EXECUTE_ET_TRACE_LIGHT "echo ${1}" #----------------------------------------- FN_EXECUTE_ET_TRACE_LIGHT () { # on incrémente le niveau de trace pour que, si la commande exécutée utilise elle-même cette fonction, les lignes de commentaires soient indentées selon le niveau d'appel let V_NIVEAU_TRACE=V_NIVEAU_TRACE+1; export V_NIVEAU_TRACE local V_INDENTATION=`FN_REPETE " " $(($V_NIVEAU_TRACE-1))` # défini en local à cause du problème de récursivité potentielle # la fonction `FN_REPETE chaine n`, répète la chaine de caractère chaine n fois V_LIGNE_COMMANDE=${1} # exécution de la ligne de commande avec écriture des heures de début/fin sur la sortie standard echo "${V_INDENTATION}** "`date "+%d/%m/%Y %H:%M:%S"`" - ligne de commande = ${V_LIGNE_COMMANDE}" eval "${V_LIGNE_COMMANDE}" V_CODE_RETOUR=$? echo "${V_INDENTATION}** "`date "+%d/%m/%Y %H:%M:%S"`" - code retour = $V_CODE_RETOUR" # on revient au niveau de trace "supérieur" let V_NIVEAU_TRACE=V_NIVEAU_TRACE-1; export V_NIVEAU_TRACE # sortie de la fonction en renvoyant le code retour du script exécuté return $V_CODE_RETOUR }
Mais je me pose des questions un peu "conceptuelles" et de performances, genre :
- Est-ce que finalement, je ne fais pas du zèle avec une fonction comme ça? (et que j'ai une vision trop "langage de programmation" qui ne colle pas forcément avec le contexte "shell unix")
- Est-ce qu'il y a moyen de faire mieux (en termes d'optimisation, de lisibilité, ...)?
- La fonction pouvant être utilisée pour lancé une commande qui lance un shell dans lequel on fait aussi appel à la fonction ... (d'où le coup de l'incrément du niveau de trace et de l'indentation), Est-ce que ça ne peut pas être couteux en ressource (j'ai lu que la récursivité n'était pas top dans les shell)?
Si vous avez un avis ou une réponse sur ces questions, je serai ravi de vous lire.
Merci par avance de me guider sur le chemin du code juste!
Partager