Configurazione utente di uno script di shell. Migliori pratiche?

13

Sto scrivendo uno script di shell con alcune variabili che dovrebbero essere configurate dall'utente. Ci sarà un programma di installazione per scaricare e configurare lo script, possibilmente facendo una serie di domande. Lo script in questione è rivolto ad altri sviluppatori.

Questo può essere implementato in diversi modi:

  1. Usa segnaposto nello script stesso e usa sed per sostituirli durante l'installazione (qualcosa di simile a questo: link )

    • Pro: tutte le definizioni di variabili sono contenute nello script. È facile scaricare lo script manualmente e configurare le variabili per gli utenti che preferiscono un editor tramite il programma di installazione.

    • Contro: È difficile riconfigurare le variabili tramite il programma di installazione una volta che sono a posto. A meno che non crei una regexp più complessa che potrebbe essere soggetta a errori.

  2. Utilizza un file di configurazione , fondamentalmente un altro script di shell con assegnazioni e usa source per includerlo. (E probabilmente inseriscilo in ~/.scriptname ? Lo script principale è copiato in /usr/local/bin )

    • Pro: è facile riconfigurare lo script. Potrebbe anche aggiungere un parametro per farlo dallo script principale (Probabilmente avrebbe funzionato anche nella prima soluzione, ma la modifica di uno script da sola non sembra un'ottima idea)

    • Contro: lo script ora dipende da due file e all'utente è richiesto di eseguire il programma di installazione per il file di configurazione da creare. Questo può essere risolto generando automaticamente un file di configurazione se non esiste. Tuttavia, l'individuazione di un file di configurazione esterno sarà ancora più complicata per gli utenti che desiderano semplicemente scaricare lo script, modificarlo e utilizzarlo.

Inoltre, alcune opzioni su come la configurazione deve essere gestita dall'utente dopo l'installazione:

  1. come $ myscript config server.host esempio.org $ myscript config server.proxypath / home / johndoe / proxy $ myscript config server.httppath / home / johndoe / web

  2. Interattivo
    $ myscript config
    Immettere il nome host del server: example.org
    Immettere il percorso del proxy sul server: / home / johndoe / proxy
    Immettere il percorso della directory http sul server: / home / johndoe / web

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

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

Ci sono altri modi per farlo che tu considereresti?
Qualche buona pratica, qualcosa di elegante?

    
posta Charlie Rudenstål 06.08.2012 - 02:11
fonte

3 risposte

5

Cosa mi aspetto da un programma sensato (uno script di shell o meno):

  • I mai e poi mai devono modificare l'eseguibile per configurarlo. Questo non è un kernel del sistema operativo.
  • Posso passare qualsiasi impostazione utilizzando la riga di comando. Questo è un must per ogni informazione che non ha un ragionevole valore predefinito. L'unica eccezione è una password che richiede l'input interattivo.
  • Opzionalmente, posso passare un'impostazione utilizzando una variabile di ambiente.
  • Posso scrivere le impostazioni in un file di configurazione e questo file verrà utilizzato se è presente sotto un nome noto o se si fa esplicito riferimento ai due metodi precedenti.
  • Il file di configurazione utilizza gli stessi nomi e sintassi delle impostazioni come riga di comando.
risposta data 06.08.2012 - 19:47
fonte
3

Quando ho bisogno di scrivere uno script elaborato con varie opzioni di configurazione io uso Python con argparse e ConfigParser librerie. Questi aiutano con l'implementazione ma il processo si applica a qualsiasi script di shell:

  1. Cerca un file di configurazione. Se ne esiste uno, leggi tutte le impostazioni che ha in una tabella di dizionario / ricerca.
  2. Analizza gli argomenti della riga di comando. Per ogni argomento fornito, sovrascrivere il valore caricato dal file di configurazione, se esistente. Per qualsiasi argomento non passato nella riga di comando e non nella configurazione, utilizzare un valore predefinito.
  3. Esegui la funzione principale dello script
  4. Se il file di configurazione non esiste, scrivi i valori passati e / o predefiniti ad esso.

La mia preferenza è che un file di configurazione contenga le opzioni preferite quando lo script verrà usato ripetutamente, ma lascia che gli argomenti della linea di comando vengano sovrascritti. Scrivi il file di configurazione utilizzando questi parametri la prima volta che viene eseguito. Il file di configurazione può quindi essere condiviso e impegnato in un repository di codice.

Nel mio caso più recente, ho anche scritto i valori predefiniti nella sezione [DEFAULT] nella parte superiore del file di configurazione, quindi ho avuto una sezione per ogni "ambiente" con le sostituzioni appropriate per ciascuno. L '"ambiente" è il primo parametro senza nome dello script. Quindi in questo caso i parametri vengono scelti come predefinito predefinito - > file di configurazione predefinito - > valore della sezione del file di configurazione - > parametro della riga di comando . Un ulteriore parametro della riga di comando consente di sovrascrivere la configurazione esistente con il valore dell'ultima versione. Questo file di configurazione viene scritto nella directory corrente in modo da essere applicato per progetto e può essere eseguito con il resto del codice. Chiunque verifichi lo stesso progetto inizierà quindi con la stessa configurazione.

    
risposta data 06.08.2012 - 17:30
fonte
2

La modifica dei segnaposti è soggetta a errori.

Vorrei andare usando un file di configurazione.

La tua preoccupazione in merito alla dipendenza è valida, tuttavia, non ricordo di aver usato troppi strumenti composti da un singolo file. Quindi, in teoria, sei corretto, ma in pratica dovrebbe essere abbastanza OK.

Una terza opzione è quella di rendere scrivere il software di configurazione una nuova versione su misura specifica per le opzioni e i parametri selezionati. Questo potrebbe essere più difficile da scrivere e testare naturalmente:)

    
risposta data 06.08.2012 - 18:20
fonte

Leggi altre domande sui tag