Leer todo el file en la memory?

¿Hay alguna manera de leer todo el file en la memory en bash, sin usar commands externos como cat ?

Conozco la syntax para get salida de un file, es decir, <(/bin/ls) , pero ahora necesito leer el file en la memory completa, es decir, $A contendría el contenido (y podría haber cosas nulas como EOF)

Bash no admite bytes nulos en las variables. foo=$(cat file) hace que $foo contenga el comienzo del file, hasta el primer byte nulo. La sustitución del command también elimina todas las nuevas líneas finales del file. Por ejemplo, si el file consta de los cuatro bytes ( a , nueva línea, nueva línea, nueva línea), entonces foo contiene solo a , lo mismo que si el file solo contenía ese byte.

Si desea preservar las nuevas líneas finales, haga los arreglos para que el command emita un carácter extra que no sea de línea nueva, luego quítelo.

 foo=$(cat file; echo a) foo=${foo%a} 

Hasta ahora todo esto funcionó en todas las conchas estilo Bourne / POSIX (cenizas, ksh, bash, …). Bash ≥4.0 tiene una forma más rápida de leer un file en una variable: el mapfile .

 mapfile <file foo 

Simplemente no hay una forma de rellenar un byte nulo en una variable bash. Si quieres esto, tienes varias opciones:

  • Use zsh.
  • Usa Perl.
  • Almacene los datos en un file temporal (lo cual parece inútil aquí, ya que los datos ya están en un file).
  • Codifique la input y decodifíquela, por ejemplo, con base64 y base64 -d .

Una forma como esta:

 $ A=$(<file) 

En lugar de una variable, una mejor opción sería leer en una matriz que facilita el acceso a diferentes líneas:

 $ OIFS=$IFS $ IFS=$'\n' $ arr=($(<file)) $ IFS=$OIFS