2014-07-11 12 views
7

È possibile ignorare gli argomenti opzionali sconosciuti con GNU getopt?linux GNU getopt: ignora gli argomenti facoltativi sconosciuti?

Ho uno script, scriptA.sh, con argomenti facoltativi --optA, --optB, --optC, --optD.

Vorrei scrivere un involucro, wrapperA, con due argomenti opzionali, --optX and --optY, che invita scriptA. Tuttavia, non voglio dichiarare tutti i parametri opzionali di scriptA all'interno del wrapper.

In particolare, se all'interno wrapperA, a specificare gli argomenti opzionali con

getopt --longoptions optX:,optY: 

la chiamata

wrapperA --optX --optA --optB 

restituisce un errore

getopt: unknown option -- optA 

Può GNU getopt essere costretti a ignorare sconosciuto argomenti e metterli dopo il '-' nella sua uscita?

risposta

5

Non è possibile indicare a GNU getopt di ignorare le opzioni sconosciute. Se vuoi veramente quella funzione dovrai scrivere il tuo parser di opzioni.

Non è semplice come ignorare le opzioni sconosciute. Come puoi dire se un'opzione sconosciuta prende una discussione o no?

Esempio di utilizzo di script originale:

originalscript --mode foo source 

qui foo è un argomento per l'opzione --mode. mentre source è un "parametro non-option" (a volte chiamato "parametro posizionale").

Esempio di utilizzo di script wrapper:

wrapperscript --with template --mode foo source 

Come può getopt in wrapperscript sapere che dovrebbe ignorare --mode insieme foo? Se ignora semplicemente --mode allora originalscript otterrà foo come primo parametro posizionale.

Una possibile soluzione consiste nel dire agli utenti del proprio script di wrapper di scrivere tutte le opzioni previste per lo script originale dopo un doppio trattino (--). Per convenzione un doppio trattino segna la fine delle opzioni. GNU getopt riconosce il doppio trattino e interrompe l'analisi e restituisce il resto come parametri posizionali.

Consulta anche:

+0

Grazie per la vostra risposta.Il doppio trattino per terminare l'elenco delle opzioni funzionerà nel mio caso. Per quanto riguarda l'ignorare le opzioni sconosciute, vedo il tuo punto: non è così facile come sembra. La mia idea originale era di spingere tutte le opzioni sconosciute dietro - in output getopt (--with template - mode foo source). Tuttavia, ciò funzionerebbe solo se la gestione dei parametri successiva viene passata al codice originale. Come hai detto, il wrapperscript non ha modo di sapere se i parametri di originalalscript accettano argomenti. – user3830744

+0

Aveva un problema simile, il doppio trattino funziona come un fascino. –

2

stavo lavorando su una cosa simile, e abbiamo trovato questo a lavorare per fermare gli errori getopt da bugging me con questi errori. Fondamentalmente, conduci gli errori all'oblio.

while getopts "i:s:" opt > /dev/null 2>&1; do 
    case $opt in 
     i) 
     END=$OPTARG 
     ;; 
    esac 
done 
./innerscript $* 

$ ./blah.sh -s 20.140.503 -i 3 -a -b -c

+0

** Si interrompe se l'argomento mancante richiede un 'OPTARG' **. https://gist.github.com/cirosantilli/2a803442add75e0f1e164cde183999d3 GNU Bash 4.3.48. –

+0

Si interrompe anche se le opzioni non valide sono (sono) passate * prima * di quelle valide. – trysis