2016-09-01 4 views
4

je vois dans certains scripts bash Linux, tels que configure scripts générés par autoconf, des séquences comme celle-ciquel est le point de créer un descripteur de fichier, puis écho à ce

exec 5>>config.log 

(...)

echo foo >&5 

(...)

echo bar >&5 

(répété plusieurs fois)

Il me semble, on pourrait tout faire

echo foo >>config.log 

qui est plus simple. Alors, quel est le point de le faire avec exec. Il doit y avoir une raison que je ne comprends pas. Qu'Est-ce que c'est?

+2

Possiblement pour la performance; il ne nécessite pas de rouvrir le fichier chaque fois que vous voulez lui envoyer quelque chose. Il a aussi d'autres différences dans la sémantique; par exemple, si vous supprimez le fichier à mi-chemin de l'exécution du script, il ne recréera pas le fichier et placera la seconde moitié de la sortie s'il contient à la place un descripteur de fichier ouvert. – davmac

+0

@davmac Je pense que vous pourriez poster cela comme une réponse. – melpomene

Répondre

5

Commodité. Si le nom de votre fichier journal cible change, vous devez rechercher & pour remplacer toutes les instances. C'est énervant. Vous pouvez atténuer ce peu avec une variable:

$LOGFILE=config.log 
echo foo>>$LOGFILE 

Performance. Chacune de ces lignes, bash doit développer LOGFILE - prend du temps. Puis bash doit fopen le fichier - prend beaucoup de temps. Puis bash peut fwrite à lui. Puis bash finalement fclose il. Donc, quand vous utilisez une chaîne, au lieu d'un descripteur de fichier, bash doit faire un tas de travail pour insérer des données dans le fichier. Un, deux, ce n'est pas un gros problème. Faire des centaines, des milliers de fois? It adds up.

Flexibilité. Une fois que vous l'avez affecté à un descripteur de fichier, vous pouvez le faire interesting things:

  • redirigent un autre endroit
  • dupliquer un autre endroit (comme stderr)
  • Fermer définitivement
  • l'appliquer dans le cadre d'un filtre