¿Cuál es la mejor manera de leer un archivo de configuración en bash?
Por ejemplo, tiene un script y no está dispuesto a completar toda la configuración manualmente cada vez que llama al script.
Edición 1: creo que no lo dejé claro, así que: lo que quiero es ... Tengo un archivo de configuración que es como
variable_name value
variable_name value ...
y quiero leer eso Sé que podría entenderlo por los argumentos que estoy buscando más o menos ... pero tal vez haya una forma más inteligente :)
Respuestas:
Como dijo mbiber,
source
otro archivo. Por ejemplo, su archivo de configuración (digamossome.config
) sería:Y tu guión podría verse así:
Los muchos archivos
/etc/default
generalmente sirven como archivos de configuración para otros scripts de shell de manera similar. Un ejemplo muy común de publicaciones aquí es/etc/default/grub
. Este archivo se utiliza para establecer las opciones de configuración de GRUB, ya quegrub-mkconfig
es un script de shell que lo genera:Si realmente debe procesar la configuración del formulario:
Entonces podrías hacer algo como:
(También podría hacer algo como
eval "$var=$value"
, pero eso es más riesgoso que obtener un script. Inadvertidamente podría romperlo más fácilmente que un archivo de origen).fuente
=
desde el principio?/etc/default
, y principalmente para un buen uso. Si su usuario despistado tiene acceso a la configuración de algo que se ejecuta como root, ya es una causa perdida.Obviamente, no soy el
bash
especialista aquí, pero el concepto no debería ser diferente en el idioma que uses:Un ejemplo
En el ejemplo a continuación, puede usar un script (muy) básico para establecer una cadena o imprimir una cadena, como se establece en su archivo de configuración:
Luego
Para establecer una cadena en su archivo de configuración:
Posteriormente, para imprimir la cadena, como se define en su "archivo de configuración":
Por supuesto, en una secuencia de comandos aplicada real, debe agregar muchas cosas para asegurarse de que los argumentos sean correctos, decidir qué hacer cuando la entrada es incorrecta, el archivo de configuración no existe, etc., pero:
Esta es la idea basica
fuente
Use
source
o.
para cargar en un archivo.o
También se recomienda verificar si el archivo existe antes de cargarlo porque no desea continuar ejecutando su script si no hay un archivo de configuración.
fuente
Estoy usando este ...
El archivo Conf se analiza con sed y luego se evalúa como tareas variables simples
Primer análisis de valores clave de sed (admite también = rodeado de espacios)
Second sed elimina espacios alrededor = signo para asignación variable válida
Se puede agregar más tratamiento de sed.
Se eliminarán todos los demás textos que no coincidan en el archivo conf (incluidos # o; comentario y otros)
¡Tenga en cuenta que los comandos de shell de una sola línea también se pueden evaluar desde este archivo de configuración!
fuente
cat
. ¿Por qué invocassed
dos veces seguidas? Puede encadenarsed
comandos de esta manera:sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g'
sed
comando generará una salida vacía para las entradas del archivo de configuración de muestra en la pregunta. -1.
comando y la redirección del proceso en lugar de variables temporales para mantener la salida del subproceso:. <(sed ... "$CFG_FILE")
eval $(sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g' "$CFG_FILE")
que es mucho mejor para entender lo que está sucediendo..
espera que un archivo y la sustitución del proceso se expanda a un archivo.. <(echo echo foo)
funciona exactamente como se esperaba en Bash v4.3.11. En pequeños ejemplos, probablemente no importará. Sin embargo, prefiero no pasar varios kilobytes a través de la sustitución de comandos.fuente