[bash] leggere stdout con dialog

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.
Avatar utente
gioco
Packager
Packager
Messaggi: 900
Iscritto il: dom 19 giu 2005, 0:00
Slackware: last stable
Località: in the court of the Wesnoth king
Contatta:

Re: [bash] leggere stdout con dialog

Messaggio da gioco »

spina ha scritto:Quello che chide danix si può comuque fare, basta creare uno scriptino che preleva i dati essenziali dall'output di cdrecord, ovvero il totale dei mega da scrivere e i mega scritti attualmente
Spina intendi una cosa del genere:

Codice: Seleziona tutto

echo "Track 01:  10 of  190 MB written (fifo 100%) [buf  99%]   8.2x." | cut -d ' ' -f4,7
?

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
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] leggere stdout con dialog

Messaggio da targzeta »

si, ma poi vanno rielaborati i dati e inviati a dialog. Dovrebbe bastare.

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
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] leggere stdout con dialog

Messaggio da targzeta »

Ok, ho trovato 10 minuti liberi :). Ecco cosa ho prodotto (non sono andato al bagno :D). Un piccolo file script che ho chiamato casa.sh:

Codice: Seleziona tutto

#!/bin/bash

IFS=$(echo -e '\n\t');
while read a; do
  dati=$(echo $a | tr -s ' ' '-' | cut -d'-' -f3,5);
  tot=${dati#*-}
  actual=${dati%-*}
  let perc=$actual*100/$tot;
  echo $perc;
done
e poi ho simulato l'output di cdrecord con:

Codice: Seleziona tutto

i=1; while (( $i <= 10 )); do echo "Track 01:  $i of  10 MB written (fifo 100%) [buf  99%]   8.2x."; let i++; sleep 1; done
e quindi ho messo tutto in pipe con:

Codice: Seleziona tutto

i=1; while (( $i <= 10 )); do echo "Track 01:  $i of  10 MB written (fifo 100%) [buf  99%]   8.2x."; let i++; sleep 1; done | sh casa.sh | dialog --gauge "ciao" 10 20
ed ha funzionato. Ora però non so se con cdrecord funziona uguale :). Spetta a danix85 darci una risposta.

facci sapere,
Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

Re: [bash] leggere stdout con dialog

Messaggio da danix »

Ciao spina, premetto che non è che ci ho capito molto dello script che mi hai postato...
ho messo su un cdrw vuoto e ho lanciato:

Codice: Seleziona tutto

$ cdrecord -v dev=/dev/hdc -dao -eject speed=8 immagine_iso.iso |sh script_spina.sh | dialog --gauge "prova gauge" 10 60 0
e mi ha restituito il prompt con la gauge piena di scritte strane e cdrecord non ha nemmeno iniziato a lavorare...

ho fatto una prova dirigendo lo stdout in un file di testo, questo è l'output:

Codice: Seleziona tutto

Cdrecord-ProDVD-ProBD-Clone 2.01.01a38 (i686-pc-linux-gnu) Copyright (C) 1995-2008 Jörg Schilling
TOC Type: 1 = CD-ROM
Using libscg version 'schily-0.9'.
atapi: 1
Device type    : Removable CD-ROM
Version        : 0
Response Format: 2
Capabilities   : 
Vendor_info    : 'HL-DT-ST'
Identifikation : 'DVDRAM GSA-4167B'
Revision       : 'DL11'
Device seems to be: Generic mmc2 DVD-R/DVD-RW/DVD-RAM.
Current: CD-RW
Profile: DVD-RAM 
Profile: DVD-R sequential recording 
Profile: DVD-R/DL sequential recording 
Profile: DVD-R/DL layer jump recording 
Profile: DVD-RW sequential recording 
Profile: DVD-RW restricted overwrite 
Profile: DVD+RW 
Profile: DVD+R 
Profile: DVD+R/DL 
Profile: DVD-ROM 
Profile: CD-R 
Profile: CD-RW (current)
Profile: CD-ROM 
Profile: Removable Disk 
Using generic SCSI-3/mmc   CD-R/CD-RW driver (mmc_cdr).
Driver flags   : MMC-3 SWABAUDIO BURNFREE 
Supported modes: TAO PACKET SAO SAO/R96P SAO/R96R RAW/R16 RAW/R96P RAW/R96R
Drive buf size : 1053696 = 1029 KB
Drive pbuf size: 1966080 = 1920 KB
FIFO size      : 4194304 = 4096 KB
Track 01: data   190 MB        
Total size:      218 MB (21:41.18) = 97589 sectors
Lout start:      219 MB (21:43/14) = 97589 sectors
Current Secsize: 2048
ATIP info from disk:
  Indicated writing power: 5
  Reference speed: 2
Disk Is not unrestricted
Disk Is erasable
  ATIP start of lead in:  -12900 (97:10/00)
  ATIP start of lead out: 359849 (79:59/74)
  1T speed low:  0 (reserved val  0) 1T speed high:  4
  2T speed low:  0 (reserved val  5) 2T speed high:  0 (reserved val 12)
  power mult factor: 4 5
  recommended erase/write power: 3
  A1 values: 02 4A B0
  A2 values: 5C C6 26
Disk type:    unknown dye (reserved id code)
Manuf. index: -1
Manufacturer: unknown (not in table)
Manufacturer is unknown because of the orange forum embargo.
As the orange forum likes to get money for recent information,
it may be that this media does not use illegal manufacturer coding.

    Capacity  Blklen/Sparesz.  Format-type  Type
           0             2048         0x00  No Media Present or Unknown Capacity
Blocks total: 359849 Blocks current: 359849 Blocks remaining: 262260
Starting to write CD/DVD/BD at speed 4 in real SAO mode for single session.
Last chance to quit, starting real write    0 seconds. Operation starts.
Waiting for reader process to fill input buffer ... input buffer ready.
BURN-Free is ON.
Turning BURN-Free off
Performing OPC...
Sending CUE sheet...
Writing pregap for track 1 at -150
Starting new track at sector: 0
Track 01:  190 of  190 MB written (fifo 100%) [buf  99%]   4.1x.
Track 01: Total bytes read/written: 199862272/199862272 (97589 sectors).
Writing  time:  370.859s
Average write speed   3.5x.
Min drive buffer fill was 99%
Fixating...
Fixating time:   24.412s
dici che così facendo si può tirare fuori quanto manca e redirigerlo a dialog o c'è troppo spreco di risorse??
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
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] leggere stdout con dialog

Messaggio da targzeta »

Ciao,
lo scriptino non era niente di ché, leggeva dallo standard input e poi estrapolava dalle righe lette il totale dei mega da masterizzare e quello che ha masterizzato, quindi produceva la percentuale attuale e la passava a dialog.
Mi sembrava chiaro che tu dovessi filtrare le righe in input eliminando quelle che non c'entravano. Comunque io ho simulato tutto grazie al tuo output e sono riuscito a farmi mettere tutte le informazioni in un textbox e poi la percentuale in un gauge. Putroppo però quando ho provato a masterizzare il CD ho scoperto che cdrecord non manda niente nello standard output, e lo si può vedere anche da quello che hai postato tu, manda solo la riga con 190 mega su 190 mega.
Peccato perchè la simulazione mi era venuta veramente carina :).
Però il dubbio a questo punto mi viene naturale, e tutti i software grafici, che altro non fanno se non lanciare cdrecord in background, come fanno per prelevare le informazioni per la progress bar? Se uno usa anche mkisofs allora si può fare, infatti mkisofs posta sempre nello standard error delle righe nuove con tutte le info necessarie a creare una progress bar, infatti basta fare

Codice: Seleziona tutto

mkisofs tmp/ 2>/dev/stdout 1>/dev/null | (IFS=$(echo -e '\n\t'); while read a; do echo $a | sed -n '/%/{s/\([[:digit:]]\+\).*/\1/;p}';done) | dialog --gauge "ciao" 8 20
tutto funziona a dovere.
Però i software grafici permettono di masterizzare anche iso già create senza lanciare (mi auguro) mkisofs. Quindi come fanno? Questo è un interessante quesito :)

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

Re: [bash] leggere stdout con dialog

Messaggio da danix »

Ciao spina,
premesso che "prenderò in prestito" il tuo scriptino casa.sh (che nome interessante, come ti è venuto in mente?? ) per usarlo nella dialog relativa a mkisofs, anche io credevo fosse più semplice catturare l'output di cdrecord... probabilmente la differenza tra uno script bash e uno dei vari programmi per masterizzare sta nel fatto che lo script bash è scritto in bash mentre i vari programmi useranno (presumibilmente) tutti C++ o robe del genere, non credi??
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Rispondi