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

Necesito registrar stdout y stderr en los files de logging, pero solo mostrar los posts 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 se llama esta cosa >(tee copyError.txt >&2) ? No puedo searchlo en Google, ya que Google ignora caracteres como los corchetes angulares y los paréntesis.

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 search páginas de manual presionando / y luego escribiendo su cadena de búsqueda, que es una buena forma de encontrar información como esta. Por supuesto, requiere que sepas en qué página de manual search 🙂

Sin embargo, debe citar el ( porque tiene un significado especial al realizar la búsqueda. Para search la sección correspondiente en la página de manual de bash, escriba />\( .

>(tee copyError.txt >&2) es en realidad algunas características diferentes:

  • >(...) se llama 'sustitución de process'. Crea un file de canalización con nombre en /dev/fd y la escritura en ese file proporcionará información para el process entre paréntesis.

  • > : En general, esto se denomina 'networkingirección de salida' y le permite enviar salida estándar ( > o 1> ) o error estándar ( 2> ) a un file o process. >&2 es la networkingirección de salida, pero en este caso, la salida de tee se envía a error estándar (eso es lo que &2 es, &1 es salida estándar)

  • Sin > , los paréntesis ( () ) iniciarán una subshell. La ejecución de commands entre paréntesis generará otro shell que solo existirá mientras se ejecuten dichos commands. Puede ver cómo funciona esto si declara una variable en la subcapa:

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

    Como puede ver, el $foo que se definió en la subcapa está separado del definido en la capa primaria.