web-dev-qa-db-fra.com

Utiliser exec et tee pour rediriger les journaux vers stdout et un fichier journal en même temps

Dans un script bash, comment puis-je rediriger toutes les sorties standard vers un fichier journal et tee la sortie à l'écran en utilisant exec?

log_file="$HOME/logs/install.txt-`date +'%Y-%m-%d_%H-%M-%S'`"
[ -f "$log_file" ] || touch "$log_file"
exec 1>> $log_file 2>&1

Ce code redirige tout le journal vers le fichier journal mais pas vers l'écran.

29
4m1nh4j1

Utilisez substitution de processus avec redirection & et exec :

exec &> >(tee -a "$log_file")
echo "This will be logged to the file and to the screen"

$log_file Contiendra la sortie du script et tous les sous-processus, et la sortie sera également imprimée à l'écran.

  • >(...) démarre le processus ... et renvoie un fichier représentant son entrée standard.

  • exec &> ... Redirige à la fois la sortie standard et l'erreur standard vers ... Pour le reste du script (utilisez uniquement exec > ... Pour la sortie standard uniquement).

  • tee -a Ajoute son entrée standard au fichier et l'imprime également à l'écran.

57
Michael Homer
exec >> $log_file 2>&1 && tail $log_file
8
Farhadix