Estoy escribiendo un script en bash para calcular el tiempo transcurrido para la ejecución de mis comandos, considere:
STARTTIME=$(date +%s)
#command block that takes time to complete...
#........
ENDTIME=$(date +%s)
echo "It takes $($ENDTIME - $STARTTIME) seconds to complete this task..."
Supongo que mi lógica es correcta, sin embargo, termino con la siguiente impresión:
"Se necesitan unos segundos para completar esta tarea ..."
¿Hay algún problema con mi evaluación de cadenas?
Creo que las variables de bash no están tipificadas, me encantaría que, sin embargo, hubiera un método de "cadena a entero" en bash.
Me parece muy limpio usar la variable interna "$ SECONDS"
SECONDS=0 ; sleep 10 ; echo $SECONDS
fuente
$SECONDS
de hecho funciona para / bin / bash. No funciona para / bin / dash, el shell predeterminado en Debian y Ubuntu.sleep 0.5
en arriba, el resultado es a veces 0, a veces 1 (al menos por Bash 5.0.3).Está intentando ejecutar el número en el
ENDTIME
como un comando. También debería ver un error como1370306857: command not found
. En su lugar, use la expansión aritmética :También puede guardar los comandos en un script separado
commands.sh
y usar el comando time:fuente
Puede usar la
time
palabra clave de Bash aquí con una cadena de formato adecuadaEsto es lo que dice
TIMEFORMAT
la referencia :fuente
Para números más grandes, es posible que deseemos imprimir en un formato más legible. El siguiente ejemplo hace lo mismo que otros, pero también se imprime en formato "humano":
Prueba simple:
Salida:
Para usar en un script como se describe en otras publicaciones (capturar el punto de inicio y luego llamar a la función con la hora de finalización:
fuente
Prueba el siguiente código:
fuente
Esta es una alternativa de una sola línea a la función de Mike Q:
fuente
SECONDS
la respuesta de Lon Kaut y tener en cuenta que $ / $ {} es innecesario en variables aritméticas hace que el código sea tan corto que incluso podría usarse en línea:echo "$((SECONDS/3600))h $(((SECONDS/60)%60))m $((SECONDS%60))s"
intente usar el tiempo con la opción de segundos transcurridos:
/usr/bin/time -f%e sleep 1
bajo bash.o
\time -f%e sleep 1
en bash interactivo.ver la página del manual de tiempo:
y
fuente
/bin/time
no va a funcionar aquí: OP menciona un bloque . Entonces realmente necesitamos la palabra clavetime
aquí.fuente
fuente