Lo estoy usando svn export
como parte de un script de empaquetado para mi aplicación y parece que este comando, como muchos otros, no tiene ningún tipo de barra de progreso.
Tengo dos opciones en este momento:
- usarlo sin opciones y verlo imprimir miles de líneas
- usando
--quiet
y no ver nada hasta que se complete.
¿Hay alguna manera de mostrar al menos el número de líneas generadas por el comando, en tiempo real? Como:
Exporting SVN directory ... 1234 files
Y mira este número1234
incremento en tiempo real? Me imagino canalizando la salida a un comando que haría precisamente esto, pero ¿cuál?
Respuesta1
yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }
O coloque la sección entre corchetes en un script de shell. Tenga en cuenta que esto sólo funciona si su shell realmente admite el operador de preincremento, como bash, ksh93 o zsh. De lo contrario, tendrá que incrementarlo $I
y luego imprimirlo (como en I=$((I+1));printf...
). Además, si printf
no es una función incorporada en su shell (es una función incorporada en bash actual), puede usar echo -ne
o print -n
en su lugar para obtener un mejor rendimiento. Solo desea suprimir la nueva línea y que \r se interprete como un carácter de escape.
Respuesta2
Esta es una idea aproximada, pero puede usar el pv
comando para contar el número de líneas a medida que pasan y mostrarlas en la pantalla. pv
entre sus muchos interruptores tiene un -l
interruptor que cuenta cada línea a medida que pasa.
Ejemplo
Aquí estoy usando un bucle while para simular algunos archivos de tu salida SVN.
$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
3 0:00:05 [0.99/s ] [ <=>
Seguirá sobrescribiendo la línea de salida de esta manera:
18 0:00:36 [ 0/s ] [ <=> ]
24 0:00:47 [0.991/s ] [ <=> ]
Respuesta3
Puede ejecutar su comando en segundo plano como un trabajo y redirigir su salida estándar (y stderr opcionalmente) a un archivo de registro: command > logfile &
donde &
designa el trabajo (si también es stderr, diga &>
en lugar de >
).
Luego puede usar la utilidad wordcount para contar el número de líneas en su archivo de registro con wc -l
.
Para mostrar el cambio de estado en una línea que cambia dinámicamente, puede usar algo como while true; do echo -en '\r'; wc -l logfile; sleep 1; done
, pero no puedo forzar a bash a dibujar \r
un retorno de carro para eliminar el contenido de la línea anterior.
Vea esta pregunta, es casi un duplicado:https://stackoverflow.com/questions/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash