4 votes

Expliquez la commande bash "exec > >(tee $LOG_FILE) 2>&1"

Mon intention était d'avoir toute la sortie de mon bash script affichée sur la console et enregistrée dans un fichier.

Voici mon script qui fonctionne comme prévu.

#!/bin/bash

LOG_FILE="test_log.log"
touch $LOG_FILE

# output to console and to logfile
exec > >(tee $LOG_FILE) 2>&1

echo "Starting command ls"
ls -al
echo "End of script"

Cependant, je ne comprends pas pourquoi il en est ainsi.

Je m'attendais à avoir exec >>(tee $LOG_FILE) 2>&1 fonctionne, mais il échoue bien que exec >>$LOG_FILE 2>&1 fonctionne en effet.

Je n'ai pas trouvé la raison de la construction exec > >(command ) dans le manuel bash ni en scripts bash avancés . Pouvez-vous en expliquer la logique ?

7voto

cdarke Points 8020

En >(tee $LOG_FILE) est un exemple de Substitution de processus Il est possible que vous souhaitiez faire une recherche à ce sujet. Scripts Shell avancés y Manuel Bash

En utilisant la syntaxe, <(program) pour la capture des données de sortie et >(program) pour l'alimentation, nous pouvons transmettre les données un seul enregistrement à la fois. C'est plus puissant que la substitution de commandes (backticks, ou $( ) ) car il se substitue à un nom de fichier et non du texte. Par conséquent, partout où un fichier est normalement spécifié, nous pouvons le remplacer par la sortie ou l'entrée standard d'un programme (bien que la substitution de processus sur l'entrée ne soit pas très courante). Ceci est particulièrement utile lorsqu'un programme n'utilise pas de flux standard pour ce que vous voulez.

Notez que dans votre exemple, il manque un espace, exec >>(tee $LOG_FILE) 2>&1 es erroné (vous obtiendrez une erreur de syntaxe),

exec > >(tee $LOG_FILE) 2>&1

a raison, cet espace est essentiel.

Ainsi, le exec > modifie le descripteur de fichier 1 (par défaut), également connu sous le nom de stdout o sortie standard pour faire référence à "ce qui vient ensuite", dans ce cas il s'agit de la substitution du processus, bien que normalement il s'agisse d'un nom de fichier.

2>&1 rediriger le descripteur de fichier 2, stderr o erreur standard pour faire référence au même endroit que le descripteur de fichier 1 (si vous omettez l'élément & vous obtenez un fichier appelé 1 ).

Une fois que vous avez fait cela, vous avez modifié la sortie standard du processus en cours, de sorte que la sortie des commandes suivantes est dirigée vers celle-ci tee processus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X