¿Cuál es la diferencia entre usar _<
y <
para stdin cuando se usa la sustitución de procesos? Esto se hace usando bash.
Ejemplo:
read bytes _< <(du -bcm random_iso.iso | tail -1); echo $bytes
Respuesta1
Eso no es un _<
operador, es un _
argumento para pasar a lectura y al <
operador de redirección. <(cmd)
en sí mismo es la sustitución de procesos (que se expande a un nombre de archivo que apunta a una tubería).
Lo que eso hace es ejecutar:
read bytes _ < /proc/self/fd/x
Donde fd x es el extremo de lectura de una tubería.
En el otro extremo (de escritura) de la tubería, se ejecuta un proceso de subcapa en segundo plano du -bcm random_iso.iso | tail -1
con su salida estándar redirigida a esa tubería.
Entonces read
almacenará en la $bytes
variable la primera palabra de la última línea de la salida de du -bcm
y el resto de la línea en la $_
variable.
Ahora no sé dónde du -bcm
tiene sentido eso. Ninguna de -b
las opciones es estándar. Si bien es bastante común y sirve para dar el tamaño acumulativo, con GNU es obtener el tamaño del archivo (no el uso del disco) en bytes, mientras que es redondear el tamaño al siguiente mebibyte, por lo que serían opciones conflictivas (aunque tal vez utilizaron por su efecto secundario de habilitación ). FreeBSD tiene (para mebibytes), no , Solaris no tiene ninguno...-c
-m
-c
du
-b
-m
-b
--apparent-size
-m
-b
Parece que fue pensado como una forma complicada de escribir:
wc -c < random_iso.iso
O:
du --apparent-size -cm random_iso.iso | awk 'END{print $1}'
Si realmente quisieran que el tamaño del archivo se redondeara al siguiente mebibyte en un sistema GNU.
Respuesta2
Como se mencionó, _<
no es una redirección. Esto pasa _
como argumento final read
. Luego <
se interpreta como un operador de redirección independiente que redirige la salida del proceso de sustitución a la entrada estándar.
Se ha vuelto convencional en los scripts Bash usarlo _
como una "variable desechable" junto con la read
función incorporada. En bash, _
es una variable especial que se establece como argumento final de un comando después de ejecutar cada comando. En este caso, significa que bytes
se asignará el primer campo y los campos restantes se descartarán en la _
variable, en lugar de asignar todos los campos restantes a bytes
.
Si bien se trata de una convención, existen varias buenas razones para evitar abusar _
de esta manera.
- Este comportamiento
_
no está especificado por POSIX. La mayoría de los proyectiles no harán nada especial con él. - En
zsh
,_
tiene elreadonly
atributo y usarlo hará que el shell arroje un error. - En
mksh
,_
solo tiene el comportamiento de bash en modo interactivo. En un script no interactivo,_
se utiliza para un propósito diferente y no se le asigna nada después de cada comando. - en
ksh93
,_
solo se establece en el último argumento del último comando en una línea. Los comandos deben estar ubicados físicamente en líneas de código separadas para poder utilizar_
. Además,_
en ksh93 está sobrecargado para tener muchos otros usos en diversos contextos, por lo que_
no se recomienda asignarlo para este propósito y hará cosas diferentes según el contexto.
Recomiendo poner un espacio antes de una redirección para aclarar las cosas. Puse algunas pautas sobre un buen estilo de redireccionamiento enEste artículo.