Estoy escribiendo un script de shell con algunas variables que el usuario debe configurar. Habrá un instalador para descargar y configurar el script, posiblemente haciendo una serie de preguntas. El script en cuestión está dirigido a otros desarrolladores.
Esto se puede implementar de varias maneras:
Use marcadores de posición en el script en sí y úselos
sed
para reemplazarlos durante la instalación (algo como esto: /programming/415677/how-to-replace-placeholders-in-a-text-file )Pros: todas las definiciones de variables están contenidas en el script. Es fácil descargar el script manualmente y configurar las variables para los usuarios que prefieren un editor sobre el instalador.
Contras: es difícil reconfigurar las variables a través del instalador una vez que están en su lugar. A menos que cree una expresión regular más compleja que sea propensa a errores.
Use un archivo de configuración , básicamente otro script de shell con asignaciones, y use
source
para incluirlo. (¿Y probablemente colocarlo~/.scriptname
? El script principal se copia a/usr/local/bin
)Pros: es fácil volver a configurar el guión. Incluso podría agregar un parámetro para hacerlo desde el script principal (probablemente también funcionaría en la primera solución, pero editar un script desde sí mismo no parece una muy buena idea)
Contras: el script ahora depende de dos archivos y el usuario debe ejecutar el instalador para que se cree el archivo de configuración. Esto se puede resolver generando automáticamente un archivo de configuración si no existe ninguno. Pero localizar un archivo de configuración externo seguirá siendo más engorroso para los usuarios que solo desean descargar el script, editarlo y terminar con él.
Además, algunas opciones sobre cómo el usuario debe administrar la configuración después de la instalación:
Git como
$ myscript config server.host example.org $ myscript config server.proxypath / home / johndoe / proxy $ myscript config server.httppath / home / johndoe / web
Configuración interactiva de $ myscript
Ingrese el nombre de host del servidor: example.org
Ingrese la ruta al proxy en el servidor: / home / johndoe / proxy
Ingrese la ruta al directorio http en el servidor: / home / johndoe / webgetopts con opciones largas
$ myscript --host example.org --proxypath / home / johndoe / proxy --httppath / home / johndoe / web
Configuración simple de $ myscript example.org / home / johndoe / proxy / home / johndoe / web
¿Hay alguna otra forma de hacer esto que considerarías?
¿Alguna mejor práctica, algo elegante?
fuente
Respuestas:
¿Qué esperaría de un programa cuerdo (un script de shell o no):
fuente
mount
o lessh
permite usar la misma sintaxis en la línea de comando y en la configuración. No necesita copiar totalmente la sintaxis de la línea de comandos; en lugar de '--foo = bar' puedes usar 'foo = bar'. Si usó 'BarOption: Foo' en su lugar, sería mucho menos conveniente: la necesidad de recordar si el caso es significativo, qué palabra clave se acepta en el archivo y cuál en la línea de comando, y la imposibilidad de copiar y pegar un comando de trabajo línea en un archivo de configuración con solo edición cosmética.Cuando necesito escribir una secuencia de comandos elaborada con varias opciones de configuración, uso Python con el argumento y bibliotecas ConfigParser . Esos ayudan con la implementación, pero el proceso se aplica a cualquier script de shell:
Mi preferencia es que un archivo de configuración contenga las opciones preferidas cuando el script se vaya a usar repetidamente, pero deje que se anule cualquier argumento de la línea de comandos. Escriba el archivo de configuración utilizando esos parámetros la primera vez que se ejecute. El archivo de configuración se puede compartir y confirmar en un repositorio de código.
En mi caso más reciente, también escribí los valores predeterminados de la
[DEFAULT]
sección en la parte superior del archivo de configuración, luego tenía una sección para cada "entorno" con anulaciones apropiadas para cada uno. El "entorno" es el primer parámetro sin nombre del script. Entonces, en este caso, los parámetros se eligen como valores predeterminados integrados -> valor predeterminado del archivo de configuración -> valor de la sección del archivo de configuración -> parámetro de línea de comandos . Un parámetro de línea de comando adicional ofrece la opción de sobrescribir la configuración existente con el valor de la última ejecución. Este archivo de configuración se escribe en el directorio actual, por lo que se aplica por proyecto y se puede confirmar con el resto del código. Cualquier otra persona que esté revisando el mismo proyecto comenzará con la misma configuración.fuente
default.config
archivo ubicado en el mismo directorio que el script, luego buscar un archivo de configuración en~/.scriptname
para anular estos valores. De esa manera, cada valor tiene un valor predeterminado válido y es más fácil de mantener.La edición de marcadores de posición es propensa a errores.
Me gustaría usar un archivo de configuración.
Su preocupación por la dependencia es válida, sin embargo, no recuerdo haber usado demasiadas herramientas compuestas de un solo archivo. Entonces teóricamente tienes razón, pero prácticamente debería estar bastante bien.
Una tercera opción es hacer que el software de configuración escriba una nueva versión personalizada que sea específica para las opciones y parámetros seleccionados. Esto puede ser más difícil de escribir y probar, por supuesto :)
fuente