J'essaie de ranger les extraits suivants, les objectifs de conception sont de consigner toutes les sorties d'un script et ne doivent pas être un wrapper. Moins de lignes, c'est mieux.
Je ne me soucie pas des entrées utilisateur (à ce stade), les scripts cibles sont exécutés de manière non interactive.
L'extrait doit
- sortie stdout pour se connecter et toujours en écho sur la console
- sortie stderr pour se connecter, et echo pour la console si le débogage est activé
- les messages stderr doivent être préfixés avec des horodatages et autres utilités
Pour le moment, j'ai ce qui suit qui ne teste que sous les versions récentes de bash (4.2+?) Comme dans Ubuntu précis, mais se comporte mal sur CentOS6.
DEBUG_LOG="${0##*/}.log"
# copy stdout to log always and echo to console
exec > >(tee -a ${DEBUG_LOG})
# copy stderr to log only, unless debugging is enabled
[ $DEBUG_TEST = "true" ] \
&& exec 2> >(tee -a ${DEBUG_LOG} >&2) \
|| exec 2>> ${DEBUG_LOG}
Ensuite ceci...
# Expand escaped characters, wrap at 70 chars on spaces,
# and indent wrapped lines
msg_log() {
echo -e "$(date +%T) ${0##*/}: $1" \
| fold -w70 -s | sed '2~1s/^/ /' >&2;
}
msg_con() {
if [ "${DEBUG_TEST}" = "true" ]; then
msg_log "$1"
else
echo -e "$1" | fold -w70 -s | sed '2~1s/^/ /';
fi
}
Au lieu de echo
je peux appeler une de ces procédures msg, par exemple msg_con "hello world"
.
De plus, la sortie du script ira ensuite à stderr en définissant une variable d'environnement au moment de l'appel, par exemple DEBUG_TEST=true myscript
.
J'ai lu que exec peut ne pas fonctionner dans certains shells tels que busybox. Il y a une combinaison mkfifo et fork sur https://stackoverflow.com/a/5200754 qui fait quelque chose de similaire mais je préfère ne pas utiliser de fork sauf si absolument nécessaire.
Préférez les exemples bash s'il vous plaît, mais quelque chose qui fonctionne sous sh ou qui est plus portable serait bien. Des idées?