usando _< en lugar de < para stdin usando bash

usando _< en lugar de < para stdin usando bash

¿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 -1con su salida estándar redirigida a esa tubería.

Entonces readalmacenará en la $bytesvariable la primera palabra de la última línea de la salida de du -bcmy el resto de la línea en la $_variable.

Ahora no sé dónde du -bcmtiene sentido eso. Ninguna de -blas 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-cdu-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 readfunció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 bytesse 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 el readonlyatributo 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.

información relacionada