Stampa qualcosa in console nello stesso punto dell'eco precedente, con una sorta di eco negativo


9

In bash puoi lanciare un comando chiamato clearper cancellare tutti i comandi dello schermo.

E con echote puoi stampare quello che vuoi sullo schermo ..

Nei miei semplici script ho spesso la necessità di stampare una percentuale di ciò che viene fatto con i miei comandi.

Quindi potrei fare qualcosa come ..

echo "89%"
echo "90%"
echo "91%"

e così via..

quello che odio è riempire lo schermo di aggiornamenti percentuali ...

89%
90%
91%
...

quello che vorrei sapere è se esiste una combinazione di caratteri speciale (ad es. "\ 033 [01; 31m") che può essere ripetuta con eco bash o php e dice alla console "rimuovi l'ultimo carattere stampato precedente ..."

farlo usando qualcosa come: (esempio php)

echo str_repeat($neg_character, strlen($last_percentage_update_string));
echo $new_percentage_update_string;

Vorrei stampare la nuova stringa nella posizione esatta della precedente senza avere lo schermo pieno di linee

Altrimenti cerco un approccio per fare lo stesso in altri modi usando sempre script bash e php (per favore includi esempi di lavoro reali almeno con una console debian9 e php7)

Risposte:


24

Il modo tipico di farlo non è cancellare un singolo carattere, ma tornare all'inizio della riga usando un ritorno a capo ( \r):

printf "89%%"; sleep 1; printf "\r90%%\n"

Si noti che questo non cancella la linea, quindi è necessario occuparsene se necessario. Le opzioni semplici sono l'aggiunta di spazi alla fine o l'output a larghezza fissa (ad es. printf "%2d%%\n" 1Dà uno spazio iniziale).

Ci sono uscite di terminale che ti permetteranno di muoverti e cancellare parti dello schermo, le sequenze CSI , ma sono dipendenti dal terminale (anche se in pratica le uscite VT100 sono supportate ovunque ora). Per esempio

printf "89%%"; sleep 1; printf "\e[3D90%%\n"

usa ␛[3Dper spostare tre caratteri a sinistra e ci scrive sopra (assumendo i tuoi printfsupporti \e);

printf "89%% hello"; sleep 1; printf "\e[0E\e[K90%%\n"

consente ␛[0Edi spostarsi all'inizio della riga corrente e ␛[Kdi cancellare fino alla fine della riga (supponendo che il proprio terminale supporti tali sequenze).

tputfornisce un modo terminale e printf-agnostico per accedere a queste sequenze:

printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%\n"

sposta il cursore a sinistra tre volte ( cub 3) e cancella fino alla fine della riga ( el), usando qualunque sequenza di caratteri sia appropriata per il terminale corrente;

printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%\n"

sposta il cursore sulla colonna più a sinistra ( hpa 0) e cancella fino alla fine della riga.

man terminfoti dirà con quale "nome di capacità" usare tput.

(Nota che molti dei dettagli degli esempi sopra riportati presuppongono che tutto il tuo output sia sulla stessa linea. Non dovrebbero essere infallibili, ma solo per illustrare vari approcci.)

Per un controllo dello schermo simile negli script PHP, è possibile esaminare l' ncursesestensione PECL .


5
Si può di solito usare tput cub 3per spostare il cu RSOR b ack da 3 colonne senza dover codificare la sequenza (e tput elper e spianatela l' l ine).
Stéphane Chazelas,

1. \enon è portatile 2. né lo è\e[0E
Steven Penny,

Grazie @Steven, avevo menzionato che le sequenze erano dipendenti dal terminale ma ho aggiunto altri qualificatori.
Stephen Kitt,

Si potrebbe usare echper la cancellazione. E spostarsi indietro di 3 posizioni ha un gotcha e due possibili ottimizzazioni che i programmi a schermo intero tendono ad usare. Ma sia l'ottimizzazione che la cancellazione sono eccessive per semplici terminali di solo linea corrente, quando si segue quel consiglio di usare un identificatore di formato a larghezza fissa. Non dimenticare che 100è lungo 3 cifre, comunque. (-:
JdeBP,

Buoni punti @JdeBP, grazie. Una volta raggiunto il 100%, spero di non aver più bisogno di aggiornamenti sui progressi ;-).
Stephen Kitt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.