Significado de la redirección '2>> (comando)' en Bash

18

Hace un tiempo hice un script y agregué algunos registros a su alrededor, pero olvidé cómo funciona la redirección para el registro :-(

La esencia de esto es:

#!/bin/bash

LOGFILE=/some/path/mylogfile

(
  # here go my commands which produce some stdout
  # and, if something goes wrong, also some stderr
) 1>>${LOGFILE} 2> >( tee -a ${LOGFILE} >&2 )

Cuando ejecuto el script, no imprime nada stdout, sino que solo imprime lo que corresponde stderr. El archivo de registro ${LOGFILE}captura stdout y stderr.

Cuando ejecuto el script y no hay salida en mi terminal, entonces sé que todo está bien. Si hay algún resultado, sé que algo salió mal y puedo verificar el archivo de registro para averiguar cuál es el problema.

La parte de la redirección que ahora me desconcierta es la sintaxis de: 2> >( some command )

¿Alguien puede explicar lo que está pasando allí?

NZD
fuente

Respuestas:

23

>(...)se llama sustitución de proceso . Permite que el programa "externo" escriba en el programa "interno" como si fuera un archivo.

En este caso, está escribiendo stderra lo tee -a ${LOGFILE} >&2que se agregará LOGFILEy luego también volverá a escribir todo stderr.

El operador de redireccionamiento puede ir en cualquier dirección para la sustitución del proceso, por lo que puede escribir en él, como en este ejemplo, o usarlo <(...)para leerlo, que es una forma práctica de, por ejemplo, hacer un whilebucle sin ejecutarlo en una subshell sí mismo.

Eric Renouf
fuente
55
¡Gracias :-) Si ejecuto echo <(date), me da el nombre del archivo sustituido: /dev/fd/63. Si ejecuto cat <(date), me da la fecha, es decir, el contenido del archivo sustituido: Fri Nov 18 14:11:09 NZDT 2016.
NZD
@NZD, sí, pero no imagines que es un archivo normal, lo que ves /deves un nombre para la tubería entre los procesos.
Toby Speight
¿Se utiliza esta técnica porque stderr no se puede canalizar (a tee, en este caso)?
bli
@bli Sí, dado que stdout ya se está redirigiendo a otra parte, me parece la forma más sencilla de teestderr y mantenerlo separado de stdout.
Eric Renouf