Quiero ejecutar algo en un shell de Linux en algunas condiciones diferentes y poder generar el tiempo de ejecución de cada ejecución.
Sé que podría escribir un script de Perl o Python que haría esto, pero ¿hay alguna manera de hacerlo en el shell? (que resulta ser bash)
Ticks
como el caso de Windows?Respuestas:
Use la
time
palabra clave incorporada :Ejemplo:
fuente
time -p i=x; while read line; do x=x; done < /path/to/file.txt
? Inmediatamente devuelve 0.00 a menos que no ponga nada antes del ciclo while ... ¿qué da?time
puede cronometrar una tubería completa tal como está (en virtud de ser una palabra clave Bash ), debe usar un comando de grupo ({ ...; ...; }
) paratime -p { i=x; while read line; do x=x; done < /path/to/file.txt; }
type -a time
Puede obtener información mucho más detallada que el bash incorporado
time
(que Robert Gamble menciona) usando el tiempo (1) . Normalmente esto es/usr/bin/time
.Nota del editor: para asegurarse de que está invocando la utilidad externa en
time
lugar de latime
palabra clave de su shell , invoque como/usr/bin/time
.time
es una utilidad obligatoria de POSIX , pero la única opción que debe admitir es-p
.Las plataformas específicas implementan extensiones específicas no estándar:
-v
funciona con la utilidad de GNUtime
, como se demuestra a continuación (la pregunta está etiquetadalinux); la implementación de BSD / macOS utiliza-l
para producir resultados similares - verman 1 time
.Ejemplo de salida detallada:
fuente
fuente
Para una medición delta línea por línea, pruebe gnomon .
También puede usar las opciones
--high
y / o--medium
para especificar un umbral de longitud en segundos, durante el cual gnomon resaltará la marca de tiempo en rojo o amarillo. Y también puedes hacer algunas otras cosas.fuente
Si desea más precisión, use
%N
condate
(y usebc
para el diff, porque$(())
solo maneja enteros).Aquí se explica cómo hacerlo:
Ejemplo:
Resultado:
fuente
Si tiene la intención de usar los tiempos posteriores para calcular, aprenda a usar la
-f
opción de/usr/bin/time
generar código que ahorre tiempo. Aquí hay un código que utilicé recientemente para obtener y ordenar los tiempos de ejecución de toda una clase de programas de estudiantes:Luego concatenaba todos los
$timefile
archivos y canalizaba la salida en un intérprete de Lua . Puede hacer lo mismo con Python o bash o cualquiera que sea su sintaxis favorita. Amo esta técnicafuente
/usr/bin/time
es necesaria porque aunquewhich time
le dirá lo contrario, si simplemente ejecutatime
, ejecutará la versión de su shell de latime
cual no acepta ningún argumento.env time
:-)Si solo necesita precisión para el segundo, puede usar la
$SECONDS
variable integrada , que cuenta el número de segundos que el shell ha estado ejecutándose.fuente
Puede usar
time
y subshell()
:O en el mismo caparazón
{}
:fuente
(
&)
(nuevo contexto, subshell ) y otro con{
&}
(mismo shell, mismo contexto)El camino es
la salida es >>
fuente
-lphtread
ni-o
etiquetas. Solo necesito usar eltime
comando, que la respuesta aceptada explica mejor.Un método posiblemente simple (que puede no satisfacer las necesidades de los diferentes usuarios) es el uso de shell PROMPT. Es una solución simple que puede ser útil en algunos casos. Puede usar la función de solicitud de bash como en el ejemplo a continuación:
El comando anterior dará como resultado el cambio del indicador de shell a:
Cada vez que ejecuta un comando (o presiona enter) que regresa al indicador del shell, el indicador mostrará la hora actual.
notas:
1) tenga en cuenta que si esperó algún tiempo antes de escribir su próximo comando, entonces esta vez debe tenerse en cuenta, es decir, la hora que se muestra en el indicador del shell es la marca de tiempo cuando se muestra el indicador del shell, no cuando ingresa el comando. algunos usuarios eligen presionar la tecla Intro para obtener un nuevo aviso con una nueva marca de tiempo antes de que estén listos para el siguiente comando.
2) Hay otras opciones y modificadores disponibles que se pueden usar para cambiar el indicador de bash, consulte (man bash) para obtener más detalles.
fuente