script - ¿Cómo borro los caracteres impresos en una aplicación de consola(Linux)?
scripts bash ejemplos (6)
Estoy creando una pequeña aplicación de consola que necesita una barra de progreso. Algo como...
Conversion: 175/348 Seconds |========== | 50%
Mi pregunta es, ¿cómo borras los caracteres ya impresos en la consola? Cuando alcanzo el porcentaje 51, tengo que borrar esta línea de la consola e insertar una nueva línea. En mi solución actual, esto es lo que sucede ...
Conversion: 175/348 Seconds |========== | 50%
Conversion: 179/348 Seconds |========== | 52%
Conversion: 183/348 Seconds |========== | 54%
Conversion: 187/348 Seconds |=========== | 56%
El código que uso es ...
print "Conversion: $converted_seconds/$total_time Seconds $progress_bar $converted_percentage%/n";
Estoy haciendo esto en Linux usando PHP (solo usaré la aplicación, así que disculpe la elección de idioma). Entonces, la solución debería funcionar en la plataforma Linux, pero si tiene una solución multiplataforma, sería preferible.
No creo que deba disculparse por la elección del idioma. PHP es un excelente lenguaje para aplicaciones de consola.
Probar esto:
<?php
for( $i=0;$i<10;$i++){
print "$i /r";
sleep(1);
}
?>
El "/ r" sobrepasará la línea con el nuevo texto. Para crear una nueva línea, simplemente puede usar "/ n", pero supongo que ya lo sabía.
¡Espero que esto ayude! Sé que esto funciona en Linux, pero no sé si funciona en Windows u otros sistemas operativos.
No estoy seguro si es lo mismo en Linux, pero en las aplicaciones de la consola de Windows puede imprimir / r y el cursor volverá a la primera posición izquierda de la línea, lo que le permite sobrescribir todos los caracteres a la derecha.
Puede usar / b para mover hacia atrás un solo carácter, pero como va a actualizar su barra de progreso, sería más fácil de usar que imprimir / bx número de veces.
hizo el truco.
Para referencia futura, / b no funciona en PHP en Linux. Tenía curiosidad, así que hice un par de experimentos en otros idiomas (hice esto en Linux, no sé si el resultado será el mismo en Windows / Mac).
/ b Funciona en ...
- Perl
- Rubí
- Tcl - con código
puts -nonewline "Hello/b"
/ b No funciona en
- PHP - el código
print "Hello/b";
imprimeHello/b
- Python -
print "Hello/b"
códigoprint "Hello/b"
imprimeHello<new line>
. Mismo resultado con laprint "Hello/b",
para borrar un carácter previamente impreso, imprimo un retroceso después de él: imprimir "a" imprimir "/ b"
no imprimirá nada (en realidad se imprimirá y luego un retroceso, pero probablemente no lo notarás)
Este parece ser un tema bastante viejo, pero dejaré mi 5 en.
for ($i; $i<_POSITION_; $i--) {
echo "/010"; //issue backspace
}
Encontré esto en Internet hace algún tiempo, lamentablemente no recuerdo dónde. Entonces todos los créditos van al autor original.
Para borrar un personaje previamente impreso, tienes tres opciones:
echo chr(8) . " ";
repite el carácter hacia atrás, y moverá el cursor hacia atrás un lugar, y el espacio sobrescribirá al personaje. Puede usarchr(8)
varias veces seguidas para retroceder varios caracteres.echo "/r";
devolverá el cursor al comienzo de la línea actual. Ahora puede reemplazar la línea con texto nuevo.La tercera opción es establecer la línea y la columna de la posición del cursor usando códigos de escape ANSI, luego imprime los caracteres de reemplazo. Puede que no funcione con todas las terminales:
function movecursor($line, $column){
echo "/033[{$line};{$column}H";
}