¿Cuál es el nombre de la función de shell `> (tee copyError.txt> & 2)`?

11

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.

dersimn
fuente
Redirección de archivos ( tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html )
Kartik
@terdon Creo que el OP ha declarado que quería registrar StdOut y StdErr en los archivos, pero también todavía muestra StdErr en la pantalla
Dmitry Avtonomov

Respuestas:

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.

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 />\(.

Martin von Wittich
fuente
Hago mucho bash, así que hice un hombre bash> bashman.txt y lo hice de solo lectura. Ahora, puedo cargar bashman.txt en otra ventana en mi editor de texto (solo lectura) y usar todas las facilidades del editor para buscar, copiar y pegar.
Joe
8

>(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 ( >o 1>) o error estándar ( 2>) a un archivo o proceso. >&2es la redirección de salida, pero en este caso, la salida de teese envía al error estándar (eso &2es, &1es 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:

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

    Como puede ver, el $fooque se definió en el subshell está separado del definido en el shell principal.

terdon
fuente
44
No >(...)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í.
Stéphane Chazelas
@StephaneChazelas Sería bueno ver la solución que tenía en mente
Dmitry Avtonomov
3
@chhh,cmd 2>&1 > output | tee err >&2
Stéphane Chazelas
@StephaneChazelas thx!
Dmitry Avtonomov
La primera mitad de esta respuesta es incorrecta, o al menos muy engañosa; Es cierto que >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 ().
ruakh