Signification de la redirection '2>> (commande)' dans Bash

18

Il y a quelque temps, j'ai fait un script et j'ai ajouté un peu de journalisation, mais j'ai oublié comment fonctionne la redirection pour la journalisation :-(

L'essentiel est:

#!/bin/bash

LOGFILE=/some/path/mylogfile

(
  # here go my commands which produce some stdout
  # and, if something goes wrong, also some stderr
) 1>>${LOGFILE} 2> >( tee -a ${LOGFILE} >&2 )

Lorsque j'exécute le script, il n'imprime rien stdout, mais imprime uniquement ce qui va stderr. Le fichier journal ${LOGFILE}capture à la fois stdout et stderr.

Lorsque j'exécute le script et qu'il n'y a pas de sortie sur mon terminal, je sais que tout va bien. S'il y a une sortie, je sais que quelque chose s'est mal passé et je peux vérifier le fichier journal pour découvrir quel est le problème.

La partie de la redirection qui me laisse maintenant perplexe est la syntaxe de: 2> >( some command )

Quelqu'un peut-il expliquer ce qui se passe là-bas?

NZD
la source

Réponses:

23

>(...)est appelé substitution de processus . Il permet au programme "externe" d'écrire dans le programme "interne" comme s'il s'agissait d'un fichier.

Dans ce cas, c'est l'écriture stderrà tee -a ${LOGFILE} >&2laquelle s'ajoutera LOGFILEpuis réécrira tout stderr.

L'opérateur de redirection peut aller dans les deux sens pour la substitution de processus, vous pouvez donc y écrire, comme dans cet exemple, ou utiliser <(...)pour lire à partir de celui-ci, ce qui est un moyen pratique pour, par exemple, faire une whileboucle sans l'exécuter dans un sous-shell lui-même.

Eric Renouf
la source
5
Got it :-) Si j'exécute echo <(date), il me donne le nom du fichier substitué: /dev/fd/63. Si j'exécute cat <(date), il me donne la date, à savoir le contenu du fichier substitué: Fri Nov 18 14:11:09 NZDT 2016.
NZD
@NZD, oui - mais n'imaginez pas que c'est un fichier normal - ce que vous voyez /devest un nom pour le canal entre les processus.
Toby Speight
Cette technique est-elle utilisée parce que stderr ne peut pas être canalisé (vers tee, dans ce cas)?
bli
@bli Ouais, puisque stdout est déjà redirigé ailleurs, cela me semble être le moyen le plus simple de teestderr et de le séparer de stdout.
Eric Renouf