without used together run how entrypoint cannot and bash shell built-in

bash - used - ¿Qué significa "<<(cmd args)" en el shell?



docker run without cmd (4)

<(comando) es la sustitución del proceso. Básicamente, crea un tipo especial de archivo llamado "canalización con nombre", luego redirige la salida del comando para que sea la tubería con nombre. Entonces, por ejemplo, supongamos que desea recorrer una lista de archivos en un directorio muy grande. Podrías hacer esto:

ls /usr/bin | more

O esto:

more <( ls /usr/bin )

Pero NO esto:

more $( ls /usr/bin )

El motivo de esto queda claro cuando investigas más:

~$ echo $( ls /tmp ) gedit.maxtothemax.436748151 keyring-e0fuHW mintUpdate orbit-gdm orbit-maxtothemax plugtmp pulse-DE9F3Ei96ibD pulse-PKdhtXMmr18n ssh-wKHyBU1713 virtual-maxtothemax.yeF3Jo ~$ echo <( ls /tmp ) /dev/fd/63 ~$ cat <( ls /tmp ) gedit.maxtothemax.436748151 keyring-e0fuHW mintUpdate orbit-gdm orbit-maxtothemax plugtmp pulse-DE9F3Ei96ibD pulse-PKdhtXMmr18n ssh-wKHyBU1713 virtual-maxtothemax.yeF3Jo

/ dev / fd / lo que sea, actúa como un archivo de texto con la salida del comando entre paréntesis.

Cuando recorre bucles recursivamente a través de carpetas con archivos que contienen espacios, el script de shell que uso es de esta forma, copiado de internet :

while IFS= read -r -d $''/0'' file; do dosomethingwith "$file" # do something with each file done < <(find /bar -name *foo* -print0)

Creo que entiendo el bit IFS, pero no entiendo qué significan los caracteres '' < <(...) ''. Obviamente hay una especie de tubería aquí.

Es muy difícil para Google "<<", ya ves.


El operador << introduce un here-document , que toma la salida de otro comando como entrada al primer comando.

Actualizar

Bueno, deben haber agregado algunas cosas al shell desde la última vez que lo usé hace 15 años.
Amablemente desprecio


<() se denomina sustitución de proceso en el manual y es similar a una canalización pero pasa un argumento de la forma /dev/fd/63 lugar de usar stdin.

< lee la entrada de un archivo nombrado en la línea de comando.

Juntos , estos dos operadores funcionan exactamente como una tubería, por lo que podrían reescribirse como

find /bar -name *foo* -print0 | while read line; do ... done


< redirige a stdin.

<() parece ser una especie de tubería inversa, como se menciona en la página:

find /bar -name *foo* -print0 | / while IFS= read -r -d $''/0'' file; do dosomethingwith "$file" # do something with each file done

no funcionará, porque el bucle while se ejecutará en una subshell, y perderá los cambios realizados en el bucle