¿Hay una manera elegante de establecer una variable de shell en el contenido de un archivo?

11

Digamos que tengo algunos datos de configuración en un archivo config. Para mayor comodidad, me gustaría cargar estos datos en una variable de shell, CONFIG_DATA.

Obviamente puedo hacer:

CONFIG_DATA="$(cat config)"

Pero esto me parece un uso inútilcat . ¿Es esta la única forma de hacer esto? ¿O hay una manera más elegante de hacerlo?

Las respuestas deberían preferir POSIX pero pueden usar cualquier shell.

Strugee
fuente
2
Leer un archivo completo en la memoria como este es casi siempre una mala idea, independientemente de cómo lo escriba.
Satō Katsura
2
@SatoKatsura en algunos casos muy cierto. sin embargo, para el propósito de esta pregunta, puede suponer que el archivo es súper pequeño, por lo que no es un problema importante.
Strugee
1
@SatoKatsura: ¿por qué?
RemcoGerlich

Respuestas:

23

En Bash y el shell Z, al menos, hay una forma más rápida:

CONFIG_DATA=$(<config)

Para citar de la página del manual del shell Bourne Again:

La sustitución del comando $ (archivo cat) se puede reemplazar por el equivalente pero más rápido $ (<archivo).

Kamaraj
fuente
1
No lo consideraría una buena opción. Cualesquiera que sean los sentimientos de OP hacia el uso inútil del gato, el ejemplo de OP es lo suficientemente simple como para que la mayoría de los usuarios de Bash lo entiendan. También es bastante portátil. Ahora $(<file)es mucho menos común, por lo que podría generar muchos más WTF; y la ganancia de velocidad de esta operación, si dicha configuración se va a cargar en una variable, probablemente sea insignificante
MatthewRock
66
@MatthewRock nota que muchas prácticas muy malas son comunes y familiares. Los usos inútiles del gato son un ejemplo, for i in $(cat file); do ...es otro. Que sean comunes no es motivo para seguir usando malas herramientas. Lo que no quiere decir que este uso particular del gato sea demasiado malo, no estoy seguro de si hay una forma más portátil. Solo digo que común y familiar! = Bueno.
terdon