GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué es exactamente <() en bash (y =() en zsh)?

Esto se llama sustitución de procesos.

El <(list) la sintaxis es compatible con ambos, bash y zsh . Proporciona una forma de pasar la salida de un comando (list ) a otro comando cuando se usa una canalización (| ) no es posible. Por ejemplo, cuando un comando simplemente no admite la entrada de STDIN o necesita la salida de múltiples comandos:

diff <(ls dirA) <(ls dirB)

<(list) conecta la salida de list con un archivo en /dev/fd , si es compatible con el sistema, de lo contrario, se usa una canalización con nombre (FIFO) (que también depende del soporte del sistema; ninguno de los manuales dice qué sucede si ambos mecanismos no son compatibles, presumiblemente aborta con un error). Luego, el nombre del archivo se pasa como argumento en la línea de comando.

zsh además admite =(list) como posible reemplazo de <(list) . Con =(list) se usa un archivo temporal en lugar del archivo en /dev/fd o un FIFO. Se puede usar como reemplazo de <(list) si el programa necesita buscar en la salida.

De acuerdo con el manual de ZSH, también podría haber otros problemas con la forma en que <(list) funciona:

El = El formulario es útil como /dev/fd y la implementación de tubería con nombre de <(...) tener inconvenientes. En el primer caso, algunos programas pueden cerrar automáticamente el descriptor de archivo en cuestión antes de examinar el archivo en la línea de comando, particularmente si esto es necesario por razones de seguridad, como cuando el programa se está ejecutando setuid. En el segundo caso, si el programa en realidad no abre el archivo, la subcapa que intenta leer o escribir en la canalización (en una implementación típica, diferentes sistemas operativos pueden tener un comportamiento diferente) se bloqueará para siempre y tendrá que eliminarse explícitamente. . En ambos casos, el shell en realidad proporciona la información mediante una canalización, de modo que los programas que esperan buscar (consulte la página del manual lseek(2) ) en el archivo no funcionará.


Tenga en cuenta que esta es una respuesta bash, no zsh.

Hay casos en bash en los que no puedes usar canalizaciones:

some_command | some_other_command

Debido a que las tuberías introducen subcapas para cada componente de la tubería, cuando las subcapas salen, cualquier efecto secundario en el que confiaba desaparecería. Por ejemplo, este ejemplo artificial:

cat file | while read line; do ((count++)); done
echo $count

mostrará una línea en blanco, porque el $count variable no existe en el shell actual.

Una sustitución del proceso bash le permite evitar este enigma al permitirle leer desde la salida "some_command" como lo haría desde un archivo

while read line; do ((count++)); done < <(cat file)
# ....................................1.2
echo $count   # the variable *does* exist in the current shell

(1) es una redirección de entrada normal. (2) es el comienzo del <() sintaxis de sustitución de procesos.


Linux
  1. ¿Diferencia entre 'y' en la línea de comando (bash)?

  2. ¿Qué sucede exactamente cuando ejecuto un archivo en el Shell?

  3. El Bash'?

  4. ¿Qué significa -s y [[]] en una condición If en Bash?

  5. ¿Qué es SUID, SGID y Sticky bit?

Comando de archivo de Linux:qué hace y cómo usarlo

Comando Ls en Linux (Lista de archivos y directorios)

¿Qué es Zsh? ¿Deberías usarlo?

¿Qué es un archivo .sh?

¿Qué es un archivo .so.2?

¿Qué es `S_ISREG()` y qué hace?