Je travaille sur un script shell qui construit une commande complexe à partir de variables, par exemple comme ceci (avec une technique que j'ai apprise dans la FAQ Bash ):
#!/bin/bash
SOME_ARG="abc"
ANOTHER_ARG="def"
some_complex_command \
${SOME_ARG:+--do-something "$SOME_ARG"} \
${ANOTHER_ARG:+--with "$ANOTHER_ARG"}
Ce script ajoute dynamiquement les paramètres --do-something "$SOME_ARG"et --with "$ANOTHER_ARG"à some_complex_commandsi ces variables sont définies. Jusqu'à présent, cela fonctionne bien.
Mais maintenant, je veux également pouvoir imprimer ou enregistrer la commande lorsque je l'exécute, par exemple lorsque mon script est exécuté en mode débogage. Donc, lorsque mon script s'exécute some_complex_command --do-something abc --with def, je veux également avoir cette commande dans une variable afin que je puisse par exemple la connecter au syslog.
La FAQ Bash montre une technique pour utiliser l' DEBUGinterruption et la $BASH_COMMANDvariable (par exemple à des fins de débogage) à cette fin. J'ai essayé cela avec le code suivant:
#!/bin/bash
ARG="test string"
trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG"
echo "Command was: ${COMMAND}"
Cela fonctionne, mais ne développe pas les variables dans la commande:
host ~ # ./test.sh
test string
Command was: echo "$ARG"
Je suppose que je dois utiliser eval pour étendre echo "$ARG"à echo test string(au moins je ne l' ai pas trouvé un moyen sans evalencore). Ce qui suit fonctionne:
eval echo "Command was: ${COMMAND}"
Il produit la sortie suivante:
host ~ # ./test.sh
test string
Command was: echo "$ARG"
Command was: echo test string
Mais je ne suis pas vraiment certain de pouvoir utiliser en evaltoute sécurité comme ça. J'ai essayé en vain d'exploiter certaines choses:
#!/bin/bash
ARG="test string; touch /x"
DANGER='$(touch /y; cat /etc/shadow)'
trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG" $DANGER
echo "Command was: ${COMMAND}"
eval echo "Command was: ${COMMAND}"
Il semble bien gérer cela, mais je suis curieux de savoir si quelqu'un d'autre voit un problème que j'ai manqué.