Poniamo che in uno script vogliamo eseguire un comando, i cui parametri sono all'interno di una variabile (o, più in generale, parte o tutta la linea di comando è presente in una variabile). Normalmente eseguiremo una cosa del genere:
PARAMS="-par1 -par2" command $PARAMS
Fin qui nessun problema. Gli scogli arrivano se dentro $PARAMS sono presenti delle wildcards, ad esempio:
PARAMS="-par1 --exclude={/dir1/*,/dir2/*}" command $PARAMS
In questo caso l'esecuzione del comando non funziona o, meglio, non funziona allo stesso modo di aver eseguito direttamente:
command -par1 --exclude={/dir1/*,/dir2/*}
Infatti l'espansione delle wildcards avviene prima dell'esecuzione del comando, durante la generazione della commandline, e questo fa si che l'effettivo comando eseguito sia:
command -par1 --exclude={/dir1/a /dir1/b /dir1/c,/dir2/a /dir2/b /dir2/...}
Spesso questo potrebbe non essere un problema reale (semplicemente viene fatta l'espansione prima del previsto). Ma a volte invece potrebbe essere un errore: ad esempio nel caso sopra la separazione con "," viene violata, senza contare che se con l'espansione la command line diventa troppo lunga il sistema potrebbe bloccare tutto.
Altro caso in cui l'espansione preventiva può creare dei problemi è quando nella command line sono presenti degli escaping (allo scopo proprio di evitare l'espansione e di passare il carattere "*" al comando).
Come fare in questi casi?
Semplice, usare il comando "eval", che deve essere posto a inizio riga:
PARAMS="-par1 --exclude={/dir1/*,/dir2/*}" eval command $PARAMS
2 Comments
passare wildcard come argomento
Inviato da Andrea (non verificato) il
Ciao andrea,
Inviato da admin il
Aggiungi un commento