Imprima algo en la consola en el mismo lugar del eco anterior, con una especie de eco negativo

9

En bash puedes lanzar un comando llamado clearpara borrar todos los comandos de la pantalla.

Y con echousted puede imprimir lo que quiera en pantalla ...

En mis scripts simples, a menudo tengo la necesidad de imprimir un porcentaje de lo que se está haciendo con mis comandos.

Entonces podría hacer algo como ...

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

y así..

lo que odio es que la pantalla esté llena de actualizaciones porcentuales ...

89%
90%
91%
...

lo que me gustaría es saber si hay una combinación especial de caracteres (por ejemplo, "\ 033 [01; 31m") que podría repetirse con bash o php echo y le dice a la consola "eliminar el último carácter impreso anterior".

hacerlo usando algo como: (ejemplo de php)

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

Obtendría la nueva cadena impresa en la posición exacta de la anterior sin tener la pantalla llena de líneas

De lo contrario, busco un enfoque para hacer lo mismo de otras maneras, siempre usando bash y scripts php (incluya ejemplos de trabajo reales al menos con una consola debian9 y php7)

usuario3450548
fuente

Respuestas:

24

La forma típica de hacer esto no es borrar un solo carácter, sino volver al inicio de la línea usando un retorno de carro ( \r):

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

Tenga en cuenta que esto no borra la línea, por lo que debe ocuparse de eso si es necesario. Las opciones simples son agregar espacios al final o hacer que la salida sea de ancho fijo (por ejemplo, printf "%2d%%\n" 1da un espacio inicial).

Hay escapes de terminal que le permitirán moverse y borrar partes de la pantalla, las secuencias CSI , pero dependen de la terminal (aunque en la práctica los escapes VT100 son compatibles en todas partes ahora). Por ejemplo

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

usa ␛[3Dpara mover tres caracteres a la izquierda y escribe sobre ellos (asumiendo sus printfsoportes \e);

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

se utiliza ␛[0Epara moverse al comienzo de la línea actual y ␛[Kpara borrar hasta el final de la línea (suponiendo que su terminal admita esas secuencias).

tputproporciona una forma terminal y printf-gnóstica de acceder a estas secuencias:

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

moverá el cursor hacia la izquierda tres veces ( cub 3) y lo despejará hasta el final de la línea ( el), utilizando la secuencia de caracteres apropiada para el terminal actual;

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

moverá el cursor a la columna más a la izquierda ( hpa 0) y borrará hasta el final de la línea.

man terminfole dirá con qué "nombre de capacidad" usar tput.

(Tenga en cuenta que muchos de los detalles de los ejemplos anteriores suponen que toda su salida está en la misma línea. No se supone que sean infalibles, solo para ilustrar varios enfoques).

Para un control de pantalla similar en los scripts PHP, puede mirar la ncursesextensión PECL .

Stephen Kitt
fuente
55
Por lo general se puede utilizar tput cub 3para mover el cu rsor b ack por 3 columnas sin tener que codificar la secuencia (y tput ela e rase la l ine).
Stéphane Chazelas
1. \eno es portátil 2. tampoco lo es\e[0E
Steven Penny
Gracias @Steven, mencioné que las secuencias dependían de la terminal, pero agregué algunos calificadores más.
Stephen Kitt el
Se podría usar echpara borrar. Y moverse hacia atrás en 3 posiciones tiene un problema, y ​​dos posibles optimizaciones que los programas de pantalla completa tienden a usar. Pero tanto las optimizaciones como el borrado son excesivos para cosas simples de terminales de línea actual, cuando uno sigue ese consejo para usar un especificador de formato de ancho fijo. No olvides que 100tiene 3 dígitos, por cierto. (-:
JdeBP
Buenos puntos @JdeBP, gracias. Una vez que llegue al 100%, espero que ya no necesite actualizaciones de progreso ;-).
Stephen Kitt el