Piu' messaggi sulla stessa riga

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
legionario
Linux 3.x
Linux 3.x
Messaggi: 603
Iscritto il: mer 8 dic 2004, 0:00
Località: Bergamo - Roma

Piu' messaggi sulla stessa riga

Messaggio 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:

Codice: Seleziona tutto

echo -e "Hello world \r"

echo -e "Hello Italy \r"
ma i due messaggi compaiono su due righe separate.

Spero di essermi spiegato bene

Grazie

Saluti

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: Piu' messaggi sulla stessa riga

Messaggio da targzeta »

Questo perchè echo di default mette un '\n' alla fine dell'output. Se invece usi l'opzione -n, allora dovrebbe funzionare:

Codice: Seleziona tutto

echo -ne "Hello world \r"

echo -e "Hello Italy \r"
Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
legionario
Linux 3.x
Linux 3.x
Messaggi: 603
Iscritto il: mer 8 dic 2004, 0:00
Località: Bergamo - Roma

Re: Piu' messaggi sulla stessa riga

Messaggio da legionario »

Grande!! Funziona!!

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Re: Piu' messaggi sulla stessa riga

Messaggio 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:

Codice: Seleziona tutto

printf ("unoXXX\r");
printf ("due\n");
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 ?

Avatar utente
legionario
Linux 3.x
Linux 3.x
Messaggi: 603
Iscritto il: mer 8 dic 2004, 0:00
Località: Bergamo - Roma

Re: Piu' messaggi sulla stessa riga

Messaggio 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?

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: Piu' messaggi sulla stessa riga

Messaggio 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:

Codice: Seleziona tutto

printf ("unoXXX\r");
printf ("due\n");
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

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Re: Piu' messaggi sulla stessa riga

Messaggio 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 :-k
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 !

Avatar utente
legionario
Linux 3.x
Linux 3.x
Messaggi: 603
Iscritto il: mer 8 dic 2004, 0:00
Località: Bergamo - Roma

Re: Piu' messaggi sulla stessa riga

Messaggio da legionario »

Ma che differenza c'e' tra printf ed echo?

E tra printf in C e printf in bash?

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: Piu' messaggi sulla stessa riga

Messaggio 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!

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: Piu' messaggi sulla stessa riga

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

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: Piu' messaggi sulla stessa riga

Messaggio 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

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: Piu' messaggi sulla stessa riga

Messaggio 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 :-k
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

Rispondi