Pagina 1 di 1
Piu' messaggi sulla stessa riga
Inviato: lun 30 giu 2008, 12:22
da legionario
Rieccomi con un'altra semplice domanda di bash:
vorrei stampare in output piu' messaggi sulla stessa riga in modo tale che il messaggio successivo sostituisca quello precedente. In C lo facevo con un escape di carriage return "\r" (se non ricordo male...) ma in bash non funziona. Ho fatto come segue:
ma i due messaggi compaiono su due righe separate.
Spero di essermi spiegato bene
Grazie
Saluti
Re: Piu' messaggi sulla stessa riga
Inviato: lun 30 giu 2008, 12:33
da targzeta
Questo perchè echo di default mette un '\n' alla fine dell'output. Se invece usi l'opzione -n, allora dovrebbe funzionare:
Spina
Re: Piu' messaggi sulla stessa riga
Inviato: lun 30 giu 2008, 12:55
da legionario
Grande!! Funziona!!
Re: Piu' messaggi sulla stessa riga
Inviato: lun 30 giu 2008, 14:30
da Dani
legionario ha scritto:In C lo facevo con un escape di carriage return "\r" (se non ricordo male...)
Come ripulivi la riga se la seconda frase da stampare era piu' corta della precedente stampata ?
Ad esempio:
così facendo sul terminale resta "dueXXX" e non è carina come cosa [-(
C'è un modo per eliminare i caratteri in piu' senza ogni volta calcolare la lunghezza delle stringhe, fare una sottrazione e stampare n spazi ?
Re: Piu' messaggi sulla stessa riga
Inviato: lun 30 giu 2008, 15:44
da legionario
Per l'esigenza dello script bash ho risolto. Comunque mi rimane la curiosita' del metodo che mi hai suggerito. Come si fa all'atto pratico?
Re: Piu' messaggi sulla stessa riga
Inviato: lun 30 giu 2008, 15:48
da Mario Vanoni
Dani ha scritto:legionario ha scritto:In C lo facevo con un escape di carriage return "\r" (se non ricordo male...)
Come ripulivi la riga se la seconda frase da stampare era piu' corta della precedente stampata ?
Ad esempio:
così facendo sul terminale resta "dueXXX" e non è carina come cosa [-(
C'è un modo per eliminare i caratteri in piu' senza ogni volta calcolare la lunghezza delle stringhe, fare una sottrazione e stampare n spazi ?
printf("due%10s\n", ""); /* se non bastano 10, mettine di piu` */
ATTENZIONE a printf(1) con sh-scripts
/bin/printf non e` identico al bash built-in printf
Re: Piu' messaggi sulla stessa riga
Inviato: lun 30 giu 2008, 16:46
da Dani
legionario ha scritto:Per l'esigenza dello script bash ho risolto. Comunque mi rimane la curiosita' del metodo che mi hai suggerito. Come si fa all'atto pratico?
La mia era una domanda

In pratica ho il tuo stesso problema, solo che in un programma C. Per sostituire una frase sempre sulla stessa riga la faccio precedere da un "\r", ma se la stringa precedentemente stampata è piu' lunga di quella da stampare restano i vecchi caratteri sul terminale.
Ho risolto, se così si puo' dire, stampando un numero di spazi che corrispondono alla lunghezza della penultima stringa meno la lunghezza dell'ultima.
Questa soluzione è noiosa e poco elegante, mi chiedevo se ci fosse qualche alternativa migliore
Mario Vanoni ha scritto:
printf("due%10s\n", ""); /* se non bastano 10, mettine di piu` */
Il problema è proprio quel "se non bastano" ! Durante l'esecuzione del programma l'accertarsi di questo rappresenta solo una noia in piu'.
Inoltre su terminali piccoli stampando troppi spazi si rischia di andare a capo, con conseguente "annullamento" del '\r'. In pratica la seconda stringa verrebbe stampata sulla nuova riga !
Re: Piu' messaggi sulla stessa riga
Inviato: lun 30 giu 2008, 18:50
da legionario
Ma che differenza c'e' tra printf ed echo?
E tra printf in C e printf in bash?
Re: Piu' messaggi sulla stessa riga
Inviato: lun 30 giu 2008, 20:14
da Mario Vanoni
legionario ha scritto:Ma che differenza c'e' tra printf ed echo?
E tra printf in C e printf in bash?
Scusa tanto, ma
man 1 printf
man 3 printf
man bash
sei proprio pigro!
Re: Piu' messaggi sulla stessa riga
Inviato: lun 30 giu 2008, 20:18
da targzeta
Mario Vanoni ha scritto:...
Scusa tanto, ma
man 1 printf
man 3 printf
man bash
sei proprio pigro!
Io non osavo dirlo, ma stavo pensando la stessa cosa...continuando così non si finisce più
Spina
Re: Piu' messaggi sulla stessa riga
Inviato: lun 30 giu 2008, 20:24
da Mario Vanoni
spina ha scritto:Mario Vanoni ha scritto:...
Scusa tanto, ma
man 1 printf
man 3 printf
man bash
sei proprio pigro!
Io non osavo dirlo, ma stavo pensando la stessa cosa...continuando così non si finisce più
Spina
Dimenticavo
man echo
/bin/echo non e` identico al built-in della bash
Re: Piu' messaggi sulla stessa riga
Inviato: lun 30 giu 2008, 21:20
da Mario Vanoni
Dani ha scritto:
La mia era una domanda

In pratica ho il tuo stesso problema, solo che in un programma C. Per sostituire una frase sempre sulla stessa riga la faccio precedere da un "\r", ma se la stringa precedentemente stampata è piu' lunga di quella da stampare restano i vecchi caratteri sul terminale.
Ho risolto, se così si puo' dire, stampando un numero di spazi che corrispondono alla lunghezza della penultima stringa meno la lunghezza dell'ultima.
Questa soluzione è noiosa e poco elegante, mi chiedevo se ci fosse qualche alternativa migliore
Mario Vanoni ha scritto:
printf("due%10s\n", ""); /* se non bastano 10, mettine di piu` */
Il problema è proprio quel "se non bastano" ! Durante l'esecuzione del programma l'accertarsi di questo rappresenta solo una noia in piu'.
Inoltre su terminali piccoli stampando troppi spazi si rischia di andare a capo, con conseguente "annullamento" del '\r'. In pratica la seconda stringa verrebbe stampata sulla nuova riga !
Se vuoi la soluzione ottimale per tutti gli schermi
e` fattibile, pero` vedi i problemi alla fine.
zzz.c
gcc -o zzz zzz.c
Questo funziona perfettamente se, qui il problema, fai prima
export COLUMNS
zzz
RATIONALE:
COLUMNS non viene esportato perche' il suo valore dipende
dalla grandezza dello schermo (X) che puo` variare.
set | less ti fa vedere COLUMNS,
env | less invece no.
Per farlo perfetto devi usare ioctls(2), qui pero` ignoro,
pare che SIGWINCH cambi se la dimensione del terminale cambia.
Altra sorgente di informazione forse e2fsck,
con computer diversi, 128 e 160 colonne,
la percentuale e` sempre verso fondo riga.
EDIT:
Pensando ai terminale vt200 di anni fa,
cols - str - 2
quelli non sopportavano un \n alla colonna 79/80.
EDIT2:
Il cast (int) strlen
perche' strlen ritorna size_t