Un an plus tard, voici un ancien script bash pour enregistrer n'importe quoi. Par exemple,
teelog make ...
enregistre dans un nom de fichier journal généré (et voir l'astuce pour enregistrer les make
imbriqués aussi.)
#!/bin/bash
me=teelog
Version="2008-10-9 oct denis-bz"
Aide() {
cat <&1 | tee `day`-command-args.log
C'est-à-dire, stdout et stderr vont à la fois à l'écran et dans un fichier journal.
(La commande Unix "tee" est nommée d'après les raccords en T, 1 entrée -> 2 sorties ;
voir http://en.wikipedia.org/wiki/Tee_(command) ).
Le nom de fichier journal par défaut est composé de "command" et de tous les "args" :
$me cmd -opt dir/file enregistre dans `day`-cmd--opt-file.log .
Pour enregistrer dans xx.log à la place, exporter log=xx.log ou
$me log=xx.log cmd ...
Si "logdir" est défini, les journaux sont placés dans ce répertoire, qui doit exister.
Un ancien xx.log est déplacé vers /tmp/\$USER-xx.log .
Le fichier journal a un en-tête comme
# from: command args ...
# run: date pwd etc.
pour montrer ce qui a été exécuté ; voir "From" dans ce fichier.
Appelé comme "Log" (ln -s $me Log), Log anycommand ... enregistre dans un fichier :
command args ... > `day`-command-args.log
et redirige stderr à la fois vers le fichier journal et le terminal -- bash seulement.
Certaines commandes qui demandent une entrée depuis la console, comme un mot de passe,
ne demandent pas si elles "| tee" ; vous ne pouvez que taper à l'avance, avec précaution.
Pour enregistrer tous les "make", y compris les imbriqués comme
cd dir1; \$(MAKE)
cd dir2; \$(MAKE)
...
export MAKE="$me make"
!
# Voir aussi : enregistrement de sortie dans screen(1).
exit 1
}
#-------------------------------------------------------------------------------
# bzutil.sh denisbz mai 2008 --
day() { # 30mar, 3mar
/bin/date +%e%h | tr '[A-Z]' '[a-z]' | tr -d ' '
}
edate() { # 19 mai 2008 15:56
echo `/bin/date "+%e %h %Y %H:%M"`
}
From() { # en-tête # from: $* # run: date pwd ...
case `uname` in Darwin )
mac=" mac `sw_vers -productVersion`"
esac
cut -c -200 <= 100 )) && break # longueur max 100
done
# pas d'espaces etc dans le nom du journal s'il vous plaît, les remplacer par "-"
echo $logdir/` echo "$log".log | tr -C '.:+=[:alnum:]_\n' - `
}
#-------------------------------------------------------------------------------
case "$1" in
-v* | --v* )
echo "$0 version : $Version"
exit 1 ;;
"" | -* )
Aide
esac
# balayer log= etc --
while [[ $1 == [a-zA-Z_]*=* ]]; do
export "$1"
shift
done
: ${logdir=.}
[[ -w $logdir ]] || {
echo >&2 "erreur : $me : impossible d'écrire dans logdir $logdir"
exit 1
}
: ${log=` logfilename "$@" `}
[[ -f $log ]] &&
/bin/mv "$log" "/tmp/$USER-${log##*/}"
case ${0##*/} in # basename
log | Log ) # à la fois vers le journal, stderr aussi vers stderr de l'appelant --
{
From "$@"
"$@"
} > $log 2> >(tee /dev/stderr) # bash seulement
# voir http://wooledge.org:8000/BashFAQ 47, stderr vers un tuyau
;;
* )
#-------------------------------------------------------------------------------
{
From "$@" # en-tête : de ... date pwd etc.
"$@" 2>&1 # exécuter la commande avec stderr et stdout à la fois vers le journal
} | tee $log
# mac tee met en mémoire tampon stdout ?
esac
0 votes
Pour les autres lecteurs : question similaire : stackoverflow.com/questions/692000/…