GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo funciona el patrón <( cmd ) en bash?

Esto se llama sustitución de procesos.

3.5.6 Sustitución de procesos

La sustitución de procesos permite hacer referencia a la entrada o salida de un proceso mediante un nombre de archivo.

La lista de procesos se ejecuta de forma asíncrona y su entrada o salida aparece como un nombre de archivo. Este nombre de archivo se pasa como argumento al comando actual como resultado de la expansión. Si se usa el formulario>(lista), escribir en el archivo proporcionará entrada para la lista. Si se usa la forma <(lista), el archivo pasado como argumento debe leerse para obtener la salida de lista. Tenga en cuenta que no puede aparecer ningún espacio entre y el paréntesis izquierdo, de lo contrario, la construcción se interpretaría como una redirección. La sustitución de procesos es compatible con sistemas que admiten canalizaciones con nombre (FIFO) o el método /dev/fd para nombrar archivos abiertos.

No es solo una cosa bash como apareció originalmente en ksh pero no está en el estándar posix.

Bajo el capó, la sustitución de procesos tiene dos implementaciones. En sistemas que soportan /dev/fd (la mayoría de los sistemas similares a Unix) funciona llamando al pipe( ) llamada al sistema, que devuelve un descriptor de archivo $fd para una nueva tubería anónima, luego crea la cadena /dev/fd/$fd , y lo sustituye en la línea de comando. En sistemas sin /dev/fd soporte, llama a mkfifo con un nuevo nombre de archivo temporal para crear una canalización con nombre y sustituye este nombre de archivo en la línea de comando.


Puedes pensar en <( somecommand ) como el nombre de archivo de un archivo temporal que contiene la salida de somecommand . En otras palabras,

utility < <( somecommand )

es un atajo para

somecommand >tempfile
utility <tempfile
rm -f tempfile

Y

utility <( somecommand )

es un atajo para

somecommand >tempfile
utility tempfile  # notice the lack of redirection here (utility expected to read from "tempfile")
rm -f tempfile

Del mismo modo >( somecommand ) puede considerarse como el nombre de archivo de un archivo temporal que se introducirá en somecommand en su entrada estándar. En otras palabras,

utility > >( somecommand )

es un atajo para

utility >tempfile
somecommand <tempfile
rm -f tempfile

Y

utility >( somecommand )

posiblemente podría ser un atajo para

mkfifo temppipe
somecommand <temppipe &
utility temppipe  # utility is expected to write to "temppipe"
rm -f temppipe

(o algo similar)


Linux
  1. ¿Cómo funciona Awk '!a[$0]++'?

  2. ¿Cómo funciona la punta adhesiva?

  3. ¿Cómo funcionan las partes internas de Sudo?

  4. ¿Cómo funciona el comando Exit en una terminal Unix?

  5. ¿Cómo funciona el comando 'ls' en Linux/Unix?

Cómo usar el comando de lectura Bash

¿Cómo funciona el intercambio de memoria en Linux?

¿Cómo funciona Rm? ¿Qué hace Rm?

La coincidencia de patrones no funciona en el script bash

¿Cómo funciona el comando ps?

¿Cómo funciona una GUI de Linux en el nivel más bajo?