Quel est le nom de la fonction shell `> (tee copyError.txt> & 2)`?

11

Je dois enregistrer stdout et stderr dans les fichiers journaux, mais afficher uniquement les messages d'erreur à l'écran. Je peux le faire avec:

cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2) 

Ce que j'ai trouvé quelque part sur le web.

Je veux juste savoir comment cette >(tee copyError.txt >&2)chose s'appelle? Je ne peux pas google pour cela, car Google ignore les caractères comme les crochets et les parenthèses ..

dersimn
la source
Redirection de fichiers ( tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html )
Kartik
@terdon Je pense que l'OP a déclaré qu'il voulait enregistrer StdOut et StdErr dans des fichiers, mais également montrer StdErr à l'écran
Dmitry Avtonomov

Réponses:

11

De man bash:

   Process Substitution
       Process substitution is supported  on  systems  that  support
       named  pipes  (FIFOs)  or  the  /dev/fd method of naming open
       files.  It takes the form of <(list) or >(list).  The process
       list  is  run with its input or output connected to a FIFO or
       some file in /dev/fd.  The name of this file is passed as  an
       argument  to  the current command as the result of the expan
       sion.  If the >(list) form is used, writing to the file  will
       provide  input  for  list.   If the <(list) form is used, the
       file passed as an argument should be read to obtain the  out
       put of list.

Vous pouvez rechercher des pages de manuel en appuyant sur /puis en tapant votre chaîne de recherche, ce qui est un bon moyen de trouver des informations comme celle-ci. Il faut bien sûr que vous sachiez dans quelle page de manuel chercher :)

Vous devez citer le (bien, car il a une signification particulière lors de la recherche. Pour rechercher la section appropriée dans la page de manuel bash, tapez />\(.

Martin von Wittich
la source
Je fais beaucoup de bash, donc j'ai fait un bash man> bashman.txt et l'ai fait en lecture seule. Maintenant, je peux charger bashman.txt dans une autre fenêtre de mon éditeur de texte (lecture seule) et utiliser toutes les fonctionnalités de l'éditeur pour rechercher, copier et coller.
Joe
8

>(tee copyError.txt >&2) est en fait quelques fonctionnalités différentes:

  • >(...)est appelé «substitution de processus». Il crée un fichier de canal nommé dans /dev/fdet l'écriture dans ce fichier fournira une entrée au processus entre parenthèses.

  • >: En général, ceci est appelé «redirection de sortie» et vous permet d'envoyer une sortie standard ( >ou 1>) ou une erreur standard ( 2>) vers un fichier ou un processus. >&2est la redirection de sortie mais dans ce cas, la sortie de teeest envoyée à l'erreur standard (c'est ce qui &2est, &1est la sortie standard)

  • Sans >, les parenthèses ( ()) lanceront un sous-shell. L'exécution de commandes entre parenthèses générera un autre shell qui n'existera que tant que ces commandes s'exécuteront. Vous pouvez voir comment cela fonctionne si vous déclarez une variable dans le sous-shell:

    $ foo='Tom';(foo='Dick'; echo "Sub: $foo"); echo "Orig: $foo"
    Sub: Dick
    Orig: Tom
    

    Comme vous pouvez le voir, celui $fooqui a été défini dans le sous-shell est distinct de celui défini dans le shell parent.

terdon
la source
4
Non >(...)n'est pas une redirection. >(...)est développé en un nom de fichier. Si vous voulez rediriger la sortie vers cela, vous en avez besoin > >(...)mais >(...)est plus généralement utilisé là où les redirections ne peuvent pas être utilisées. La commande de l'OP peut être obtenue avec des tuyaux traditionnels, il n'y a pas besoin de substitution de processus là-bas.
Stéphane Chazelas
@StephaneChazelas Ce serait bien de voir la solution que vous aviez en tête
Dmitry Avtonomov
3
@chhh,cmd 2>&1 > output | tee err >&2
Stéphane Chazelas
@StephaneChazelas thx!
Dmitry Avtonomov
La première moitié de cette réponse est fausse, ou du moins très trompeuse; il est vrai que cela >peut désigner la redirection de sortie et cela ()peut désigner un sous-shell, mais >(...)c'est en fait une seule fonctionnalité unitaire qui ne se compose pas de >et ().
ruakh