[Bash] Nascondere cursore lampeggiante

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3797
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

[Bash] Nascondere cursore lampeggiante

Messaggio da joe »

Ho un piccolo script che scarica alcune pagine ne fa il parse e restituisce a video alcune informazioni.
Per "abbellire" un attimo e sperimentare un po' ho voluto aggiungere un elmento in movimento per far capire che il programmino sta lavorando.
Siccome le pagine che deve scaricare sono più di una e più in generale le operazioni che compie sono diverse ho pensato di far stampare ad output qualcosa del genere:

Codice: Seleziona tutto

Operazione_1:
* Downloading page 1_________________  Done.
* Downloading page 2_________________  Done.
Operazione_2:
* Loading pippo_______________________ \
L'aspetto che mi interessa stà nell'ultima riga, che rappresenta un'operazione in corso: notare la barretta rotante in fondo alla riga "\" che poi ovviamente diventa "|", "/", "-", ecc.
Ok, il problema sta nel fatto che il cursore resta lì a lampeggiare proprio in corrispondenza della "barretta rotante". Cioè resta lì dove lo script è arrivato a stampare... però io vorrei nascondere il cursore in modo che si vedesse meglio la barretta che sta girando.
Si può fare in qualche modo?

La barretta rotante l'ho ottenuta con un ciclo "for i in \ | / - " messo dentro a un while [ 1 ] con un controllo e via dicendo... se serve posso postare direttamente il codice.... ma penso che il problema sia chiaro così.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [Bash] Nascondere cursore lampeggiante

Messaggio da targzeta »

Codice: Seleziona tutto

echo -e '\E[?25l'
Poi per ripristinarlo:

Codice: Seleziona tutto

echo -e '\E[?25h'
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3797
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

Re: [Bash] Nascondere cursore lampeggiante

Messaggio da joe »

Perfetto, precisamente quello che mi serviva. Grazie mille. :)

Già che siamo in argomento, in base alla vostra esperienza quali alternative ritenete interessanti rispetto alla baretta rotante?
Ovviamente il limite è la propria fantasia, ma magari ci sono scelte migliori di altre "a prescindere".
Si tratta solo di una curiosità eh...

Avatar utente
freefred
Linux 0.x
Linux 0.x
Messaggi: 87
Iscritto il: dom 28 set 2008, 19:08
Slackware: 13.1
Kernel: 2.6.36.2
Desktop: kde 4.4.3
Contatta:

Re: [Bash] Nascondere cursore lampeggiante

Messaggio da freefred »

joe ha scritto:Perfetto, precisamente quello che mi serviva. Grazie mille. :)

Già che siamo in argomento, in base alla vostra esperienza quali alternative ritenete interessanti rispetto alla baretta rotante?
Ovviamente il limite è la propria fantasia, ma magari ci sono scelte migliori di altre "a prescindere".
Si tratta solo di una curiosità eh...
Piu' che altro (ma dipende ovviamente dai tempi) a me piace vedere la percentuale di quello che sta facendo uno script
o un programma in console, poi se graficamente accanto c'e' una barretta rotante o una barra di scorrimento, non e' molto importante.
(ma non sono un programmatore)

bye

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [Bash] Nascondere cursore lampeggiante

Messaggio da Mario Vanoni »

http://linux.die.net/man/1/pv
dovrebbe soddisfare gli ultimi due post.

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3797
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

Re: [Bash] Nascondere cursore lampeggiante

Messaggio da joe »

freefred ha scritto:
joe ha scritto:
Già che siamo in argomento, in base alla vostra esperienza quali alternative ritenete interessanti rispetto alla baretta rotante?
Ovviamente il limite è la propria fantasia, ma magari ci sono scelte migliori di altre "a prescindere".
Si tratta solo di una curiosità eh...
Piu' che altro (ma dipende ovviamente dai tempi) a me piace vedere la percentuale di quello che sta facendo uno script
o un programma in console, poi se graficamente accanto c'e' una barretta rotante o una barra di scorrimento, non e' molto importante.
(ma non sono un programmatore)

bye
Eh lo so...
Però capisci bene che per far apparire qualcosa che indichila percentuale di completamento di un certo "pacchetto" di operazioni implica l'introduzione di un calcolo più o meno complesso per stimare questa percentuale. Può non essere così banale e soprattutto può non essere così leggero da eseguire e addirittura rallentare in modo non trascurabile le stesse operazioni che sta eseguendo lo script.... A quel punto potrebbe essere un controsenso mostrare la percentuale.

La barretta rotante in fin dei conti consuma poco e dà l'idea che lo script stia lavorando... e sicuramente non ha alcuna utilità al di la dell'estetica, sono d'accordo su questo.
Mario Vanoni ha scritto:http://linux.die.net/man/1/pv
dovrebbe soddisfare gli ultimi due post.
Come useresti pv se lo script comprendesse il download di alcuni files con wget?

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [Bash] Nascondere cursore lampeggiante

Messaggio da Mario Vanoni »

joe ha scritto: Come useresti pv se lo script comprendesse il download di alcuni files con wget?
Sinceramente ignoro, non avendo mai usato wget(1).

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3797
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

Re: [Bash] Nascondere cursore lampeggiante

Messaggio da joe »

L'idea potrebbe essere questa:
- redirigere i dati scaricati non su un file bensì sullo standard output: wget -O - "$URL"
- poi prendere quell'output con una pipe e spedirlo in input a "pv" e scrivere l'utput di quest'ultimo sul file che sarà poi il file scaricato

Riassumendo, qualcosa del genere potrebbe funzionare:

Codice: Seleziona tutto

wget -q -O - "$URL" | pv > ${filescaricato}
Ma tutto ciò non risolve il discorso della percentuale di avanzamento, banalmente perchè pv non conosce la dimensione finale dei dati che stanno arrivando. Segnala solo una barra con freccetta che va avanti e indietro (e a quel punto tanto valeva la barretta rotante) e il tempo trascorso, nonchè la dimensione attuale del file in output e la velocità di accrescimento dello stesso che poi sarebbe più o meno la velocità di trasferimento dati.
Solo wget liscio quindi, come era prevedibile, può darci info precise dell'avanzamento in percentuale. Semplicemente perchè conosce in anticipo le dimensioni totali del file remoto che sta scaricando.

Diverso è il discorso dell'uso di pv per trasferire un file locale verso un indirizzo remoto (per esempio anche usando mv o cp). In quel caso abbiamo il file in locale e pv sa anche lui in anticipo quanto è grande riuscendo così a calcolare la percentuale del trasferimento completato.
Penso che sostanzioalmente il discorso sia questo.

Il mio intento era quello di rinunciare all'output di wget spedendo tutti i messaggi in /dev/null e poi ricreare un output personalizzato riuscendo a controllarlo a piacimento nella sua forma. Ma evidentemente mancano dei dati per ottenere la percentuale di avanzamento.

Il tutto ovviamente a titolo di completezza della questione wget più percentuale di completamento del processo.

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [Bash] Nascondere cursore lampeggiante

Messaggio da Mario Vanoni »

joe ha scritto: Ma evidentemente mancano dei dati per ottenere la percentuale di avanzamento.

Il tutto ovviamente a titolo di completezza della questione wget più percentuale di completamento del processo.
fsck conosce il disco prima di partire, poi barra di progressione e percentuale raggiunta.

wget [option]... [URL]...
non lo sapra` mai, anche in due passi, se URL nel frattempo aggiunge e/o spegne infos?

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3797
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

Re: [Bash] Nascondere cursore lampeggiante

Messaggio da joe »

Giusto. Però in due passi qualcosa si può fare... accettando una ragionevole probabilità d'errore...
Se per esempio come URL consideriamo un file oppure una pagina html possiamo ritenere che questa resti delle stesse dimensioni per un tempo sufficentemente piccolo accettando eventuali errori che al limite comportano solo una barra di avanzamento che va oltre il 100% o che raggiunge la fine al 90% dei dati trasferiti... mi spiego:
l'opzione "-s" di pv consente di specificare le dimensioni dei dati trasferiti.
Per esempio:

Codice: Seleziona tutto

wget -q -O - "$URL" | pv -s $SIZE > ${filescaricato}
stabilisce che il 100% del trasferimento è raggiunto dopo aver completato i "$SIZE" bytes di dati.
Ora wget è in grado di stabilire le dimensioni di un file remoto. usando per esempio le opzioni "--spider -S". E lavorando quindi di sed e grep si può ottenere il valore in bytes di un file remoto.

Una volta conosciuto quel valore si usa il comando sopraindicato wget+"pv -s" specificando la grandezza del file.

Non so se mi sono spiegato:

Codice: Seleziona tutto

SIZE=$(wget -S --spider "$URL" 2>&1|grep Length |sed 's/.*: //')
wget -q -O - "$URL" | pv -s $SIZE> ${filescaricato}
Questo dovrebbe garantire con una probabilità d'errore accettabile a pv di conoscere in anticipo le dimensioni del trasferimento e quindi la percentuale di avanzamento e renderlo in grado di disegnare la barra di avanzamento in modo coerente.

Rispondi