Necesito registrar stdout y stderr en logfiles, pero solo mostrar los mensajes de error en la pantalla. Puedo hacer esto con:
cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2)
Que encontré en algún lugar de la web.
Solo quiero saber cómo >(tee copyError.txt >&2)
se llama esta cosa. No puedo buscarlo en Google, ya que Google ignora los caracteres como los corchetes angulares y los paréntesis.
Respuestas:
De
man bash
:Puede buscar páginas de manual presionando
/
y luego escribiendo su cadena de búsqueda, que es una buena manera de encontrar información como esta. Por supuesto, requiere que sepas en qué página del manual buscar :)Sin
(
embargo, debe citarlo porque tiene un significado especial al buscar. Para encontrar la sección relevante en la página de manual de bash, escriba/>\(
.fuente
>(tee copyError.txt >&2)
en realidad tiene algunas características diferentes:>(...)
se llama 'sustitución de proceso'. Crea un archivo de canalización con nombre/dev/fd
y escribir en ese archivo proporcionará información al proceso entre paréntesis.>
: En general, esto se llama 'redirección de salida' y le permite enviar salida estándar (>
o1>
) o error estándar (2>
) a un archivo o proceso.>&2
es la redirección de salida, pero en este caso, la salida detee
se envía al error estándar (eso&2
es,&1
es la salida estándar)Sin
>
paréntesis (()
) se iniciará una subshell. Los comandos en ejecución entre paréntesis generarán otro shell que solo existirá mientras esos comandos estén en ejecución. Puede ver cómo funciona esto si declara una variable en la subshell:Como puede ver, el
$foo
que se definió en el subshell está separado del definido en el shell principal.fuente
>(...)
no es una redirección.>(...)
se expande a un nombre de archivo. Si desea redirigir la salida a eso, necesita> >(...)
pero>(...)
se usa más generalmente donde no se pueden usar las redirecciones. El comando del OP se puede lograr con tuberías tradicionales, no hay necesidad de sustitución de procesos allí.cmd 2>&1 > output | tee err >&2
>
puede denotar la redirección de salida y que()
puede denotar una subshell, pero en>(...)
realidad es una característica única y unitaria que no consiste en>
y()
.