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 ..
Réponses:
De
man bash
: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/>\(
.la source
>(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/fd
et 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 (>
ou1>
) ou une erreur standard (2>
) vers un fichier ou un processus.>&2
est la redirection de sortie mais dans ce cas, la sortie detee
est envoyée à l'erreur standard (c'est ce qui&2
est,&1
est 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:Comme vous pouvez le voir, celui
$foo
qui a été défini dans le sous-shell est distinct de celui défini dans le shell parent.la source
>(...)
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.cmd 2>&1 > output | tee err >&2
>
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()
.