2010-10-27 20 views
4

Je voudrais avoir un script dans lequel toutes les commandes sont tee 'd dans un fichier journal.Force `tee` à exécuter pour chaque commande dans un script shell?

En ce moment je suis en cours d'exécution chaque commande dans le script ainsi:

<command> | tee -a $LOGFILE 

Y at-il un moyen de forcer chaque commande dans un script shell pour tuyau à tee?

Je ne peux pas forcer les utilisateurs à ajouter appropriée lors de l'exécution tee ment le script, et que vous voulez vous assurer qu'il enregistre correctement, même si l'utilisateur appelant n'ajoute pas un appel d'enregistrement de leur propre.

Répondre

15

Vous pouvez faire un wrapper dans votre script:

#!/bin/bash 
{ 
echo 'hello' 
some_more_commands 
echo 'goodbye' 
} | tee -a /path/to/logfile 

Edit:

Voici une autre façon:

#!/bin/bash 
exec > >(tee -a /path/to/logfile) 
echo 'hello' 
some_more_commands 
echo 'goodbye' 
+0

J'aime celui-ci - je n'avais pas pensé à utiliser des parenthèses – warren

+1

@warren: voir mon edit pour une autre méthode. –

2

Pourquoi ne pas exposer une enveloppe qui est tout simplement:

/path/to/yourOriginalScript.sh | tee -a $LOGFILE 

Vos utilisateurs ne doivent pas exécuter (et qui ne savent même pas) yourOriginalScript.sh.

1

Une certaine approche serait la création du script runner "run_it" que tous les utilisateurs appellent leurs propres scripts.

run_it my_script 

Toute la magie serait effectuée à l'intérieur, par ex. pourrait ressembler à ça:

LOG_DIR=/var/log/ 
[email protected] | tee -a $LOG_DIR/ 
2

En supposant que votre script ne prend pas un argument --tee, vous pouvez le faire (si vous ne pas utiliser cet argument, il suffit de remplacer --tee ci-dessous avec un argument que vous n'utilisez pas):

#!/bin/bash 

if [ -z "$1" ] || [ "$1" != --tee ]; then 
    $0 --tee "[email protected]" | tee $LOGFILE 
    exit $? 
else 
    shift 
fi 
# rest of script follows 

Ce juste a le script se relancer, en utilisant l'argument spécial --tee pour éviter une récursion infinie, la tuyauterie de sa sortie en tee.

+0

Peut également utiliser 'exec' pour ne pas fourcher un processus supplémentaire:' if ...; alors exec $ 0 --tee "$ @"; autre; décalage; fi' (la sortie ne sera plus nécessaire) ... – FooF