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?
la source
exec > filename
devrait fonctionner dans sh, et cela fonctionne en fait dans busybox v1.15.3 (novembre 2011). Mais la substitution de processus>(command)
n'est pas transférable car c'est l'extension bash. Évitez simplement de l'utiliser dans des scripts. Pourquoi>>
ne vous suffit-il pas?Une autre solution consiste à spécifier la redirection en dehors de vos scripts. Lorsque votre script est invoqué en arrière-plan (par cron, ou script système, etc.), ils doivent être appelés comme ceci
Lorsque vous appelez le script manuellement et que vous souhaitez voir la sortie, appelez-le simplement sans redirection.
la source
Ces deux exemples feront ce que sont vos objectifs déclarés
ou
la source
Vous pouvez utiliser la
tee
commande ou lesscript
deux commandes sont vraiment utiles.la source