Download facili dalla riga di comando? Vi mostreremo che è possibile ottenere anche questo rendendo wget interattivo e dotandolo di una pratica interfaccia gafica
(pagina 1 di 4)
Diciamoci la verità: usare wget
( www.gnu.org/software/wget), il potente
download manager a riga di comando,
non è la cosa più pratica e immediata
che esista. Non a caso, nelle pagine di manuale,
questo software è descritto come "The noninteractive
network downloader" (lo “scaricatore”
di rete non interattivo). In effetti, il programma
non permette alcun tipo di interazione
con l'utente e le numerose opzioni disponibili non
sono facilmente gestibili, caratteristiche queste
che, il più delle volte, lo rendono idoneo solo
per il download di singoli file o interi siti web che non richiedono scelte
interattive da parte dell'utente. Ebbene, gli script che proponiamo
in questo numero, hanno l'obiettivo di semplificare l'utilizzo del programma,
riducendo il numero di opzioni al minimo indispensabile per
un uso “normale”, senza però impedire agli utenti più esperti di sfruttarne
tutte le potenzialità. In particolare, con il
primo script presentiamo una nostra “interpretazione”
di wget, sempre a riga di comando,
mentre con il secondo ci appoggeremo a Zenity
(http://directory.fsf.org/project/zenity) per
dotarlo di una, seppur minimale, interfaccia
grafica. In entrambi i casi analizzeremo la situazione
in cui è necessario scaricare interi siti,
stabilendone il livello di profondità. Per il
resto, non occorre nulla: wget è presente di default
su ogni distribuzione.
Un “Interprete” per la riga di comando
Lo script easyget.sh rende interattivo l'uso di wget
Quando si crea uno script shell, è molto importante prevedere una serie
di opzioni da passare sulla riga di comando, in modo dare all'utente
la possibilità di modificare il comportamento del programma in relazione
a ciò che vuole ottenere. Per interpretare in modo semplice queste opzioni,
che possono anche essere molto numerose, in genere si utilizza il
comando getopts (presente come predefinito in tutte le distribuzioni),
derivato dall'omonima funzione della libreria standard C. Questo comando
ha un funzionamento piuttosto sofisticato, per cui ci limiteremo al suo
uso di base. In pratica, getopts opera nel modo seguente: ogni volta che
viene invocato analizza una delle opzioni passate sulla riga di comando
nel formato -opt (con opt pari ad una lettera) e la pone in una variabile
predefinita; la variabile OPTIND tiene traccia della posizione dell'opzione
successiva e viene, quindi, incrementata ad ogni chiamata. La
sintassi di base di getopts è la seguente:
while getopts "abcdef" opt
do
case $opt in
a function1 ;;
b function2 ;;
c function3 ;;
d function4 ;;
e function5 ;;
f function6 ;;
esac
done
In questo caso la funzione analizza la riga di comando ed il ciclo case viene
eseguito per ogni opzione trovata: le opzioni cercate sono quelle
elencate dopo getopts, ovvero “-a”, “-b”, “-c”, ecc. Ad ogni esecuzione
il valore della variabile $opt viene posto pari alla lettera trovata (rimuovendo
il carattere “-”), e il comando case seleziona la funzione da
eseguire o l'insieme di comandi desiderato. Ad esempio se la riga di
comando presentasse le opzioni “-a -d -f” verrebbero eseguite in sequenza
le funzioni function1(), function4() e function6(). È importante
notare che la variabile OPTIND viene incrementata ad ogni esecuzione
di getopts, e pertanto alla fine del ciclo riportato sopra avrebbe
valore pari a 7. Nel caso fosse necessario processare più volte la riga
di comando, con diversi cicli while, è fondamentale impostare nuovamente
ad 1 il valore di OPTIND prima di ogni ciclo (all'inizio del
programma tale variabile è automaticamente impostata ad 1).