Configuración de usuario de un script de shell. ¿Mejores prácticas?

13

Estoy escribiendo un script de shell con algunas variables que deben ser configuradas por el usuario. 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:

  1. Use marcadores de posición en el script y use sed para reemplazarlos durante la instalación (algo como esto: enlace )

    • 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.

  2. Use un archivo de configuración , básicamente otro script de shell con asignaciones, y use source para incluirlo. (Y, probablemente, colóquelo en ~/.scriptname ? El script principal se copia a /usr/local/bin )

    • Pros: Es fácil reconfigurar el script. Incluso podría agregar un parámetro para hacerlo desde la secuencia de comandos principal (probablemente también funcionaría en la primera solución, pero la edición de una secuencia de comandos no parece una buena idea)

    • Contras: el script ahora depende de dos archivos y el usuario debe ejecutar el instalador para crear el archivo de configuración. Esto se puede resolver generando automáticamente un archivo de configuración si no existe ninguno. Pero la ubicación de un archivo de configuración externa será aún más incómoda para los usuarios que solo desean descargar el script, editarlo y terminar con él.

También, algunas opciones sobre cómo la configuración debe ser administrada por el usuario después de la instalación:

  1. Git like
    $ myscript config server.host example.org $ myscript config server.proxypath / home / johndoe / proxy $ myscript config server.httppath / home / johndoe / web

  2. Interactivo
    $ myscript config
    Ingrese el nombre de host del servidor: example.org
    Introduzca la ruta al proxy en el servidor: / home / johndoe / proxy
    Ingrese la ruta al directorio http en el servidor: / home / johndoe / web

  3. getopts con opciones largas
    $ myscript --host example.org --proxypath / home / johndoe / proxy --httppath / home / johndoe / web

  4. Simple
    $ myscript config example.org / home / johndoe / proxy / home / johndoe / web

¿Hay otras formas de hacer esto que consideraría?
¿Alguna de las mejores prácticas, algo elegante?

    
pregunta Charlie Rudenstål 06.08.2012 - 02:11

3 respuestas

5

¿Qué esperaría de un programa sano (un script de shell o no)?

  • Nunca nunca tengo que modificar el archivo ejecutable para simplemente configurarlo. Esto no es un núcleo de sistema operativo.
  • Puedo pasar cualquier configuración utilizando la línea de comandos. Esta es una necesidad para cada pieza de información que no tenga un valor predeterminado razonable. La única excepción es una contraseña que necesita una entrada interactiva.
  • Opcionalmente, puedo pasar una configuración usando una variable de entorno.
  • Puedo escribir las configuraciones en un archivo de configuración, y este archivo se usará si está presente con un nombre conocido, o se señala explícitamente mediante los dos métodos anteriores.
  • El archivo de configuración usa los mismos nombres de configuración y sintaxis como línea de comando.
respondido por el 9000 06.08.2012 - 19:47
3

Cuando necesito escribir un script elaborado con varias opciones de configuración, uso Python con argparse y ConfigParser bibliotecas. Esos ayudan con la implementación, pero el proceso se aplica a cualquier script de shell:

  1. Busque un archivo de configuración. Si existe una, lea cualquier configuración que tenga en una tabla de búsqueda / diccionario.
  2. Analizar los argumentos de línea de comando nombrados. Para cada argumento proporcionado, invalide el valor cargado del archivo de configuración si existe. Para cualquier argumento que no se haya pasado en la línea de comandos y no en la configuración, use un valor predeterminado.
  3. Ejecutar la función principal del script
  4. Si el archivo de configuración no existe, escriba los valores pasados y / o predeterminados en él.

Mi preferencia es que un archivo de configuración contenga las opciones preferidas cuando se va a utilizar el script repetidamente, pero permita que se invaliden los argumentos de la línea de comandos. Escriba el archivo de configuración utilizando esos parámetros la primera vez que se ejecuta. El archivo de configuración se puede compartir y enviar a un repositorio de código.

En mi caso más reciente, también escribí los valores predeterminados en la sección [DEFAULT] en la parte superior del archivo de configuración, luego tuve una sección para cada "entorno" con las sustituciones 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 integrado por defecto - > archivo predeterminado de configuración - > valor de la sección del archivo de configuración - > parámetro de línea de comando . 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 está escrito en el directorio actual por lo que se aplica por proyecto y se puede confirmar con el resto del código. Cualquier persona que revise el mismo proyecto comenzará con la misma configuración.

    
respondido por el Matt S 06.08.2012 - 17:30
2

La edición de marcadores de posición es propensa a errores.

Me gustaría usar un archivo de configuración.

Su preocupación acerca de la dependencia es válida, sin embargo, no recuerdo haber usado demasiadas herramientas que estén compuestas por un solo archivo. Por lo tanto, teóricamente tienes razón, pero en la práctica debería estar bastante bien.

Una tercera opción es hacer que el software de configuración escriba una nueva versión adaptada que sea específica para las opciones y los parámetros seleccionados. Esto puede ser más difícil de escribir y probar, por supuesto :)

    
respondido por el NoChance 06.08.2012 - 18:20

Lea otras preguntas en las etiquetas