¿Es posible agregar a la fuerza un alias de tiempo (por falta de una mejor manera de expresarlo) a cada comando bash
?
Por ejemplo, me gustaría tener un usuario específico que siempre que se ejecuta un comando, siempre se envuelve con date
antes y después, o time
.
¿Es posible? y si lo es, cómo?
preexec
, pero no desea ejecutarlo dentro delpreexec
(por ejemplopreexec() { time $1; }
), porque el shell todavía lo ejecuta después de quepreexec
regrese. Entonces, lo mejor que podemos hacer es algo similar.preexec()
función para envolver lo que se estaba ejecutando al buscar el comando, ejecutarlo usted mismo desde dentro de la función y luego devolver algún tipo de error para que el shell no ejecute el comando en sí.Respuestas:
Puede registrar la hora en que se inicia una línea de comando y la hora en que se muestra una solicitud. Bash ya realiza un seguimiento de la fecha de inicio de cada línea de comando en su historial, y puede observar la hora en que muestra el siguiente mensaje.
Esto solo le brinda una segunda resolución y solo el tiempo del reloj de pared. Si desea una mejor resolución, debe usar un
date
comando externo que admita el%N
formato para nanosegundos y laDEBUG
trampa para llamardate
antes de ejecutar el comando a tiempo.Incluso con la
DEBUG
trampa, no creo que haya una manera de mostrar automáticamente los tiempos de procesador para cada comando, o ser más discriminatorio que prompt to prompt.Si está dispuesto a usar un shell diferente, aquí le mostramos cómo obtener un informe de tiempo para cada comando en zsh (esto no se generaliza a otras tareas):
Puede establecer
REPORTTIME
cualquier valor entero, la información de temporización solo se mostrará para los comandos que usaron más de estos segundos de tiempo de procesador.Zsh tomó esta característica de csh donde se llama a la variable
time
.fuente
Sus opciones aquí dependerán de su shell. En
zsh
Existe una función de enlace conveniente llamadapreexec()
que se ejecuta justo antes de que los comandos de shell interactivas. Al crear una función con este nombre, puede hacer que se ejecuten cosas. También puede realizar un seguimiento con una función llamadaprecmd()
que se ejecutará justo antes de que se dibuje el siguiente mensaje, que será justo después de que finalice su comando.Al crear este par de funciones, puede ejecutar los comandos arbitrarios que desee ejecutar antes y después de los comandos emitidos en el indicador. Puede usar esto para registrar el uso de shell, crear bloqueos, probar el entorno o, como en su ejemplo, calcular el tiempo o los recursos gastados mientras se ejecuta un comando.
En este ejemplo, crearemos una marca de tiempo de referencia antes de ejecutar un comando usando,
preexec()
luego calcularemos el tiempo empleado en ejecutar el comandoprecmd()
y lo enviaremos antes del aviso o lo desconectaremos. Ejemplo:Nota: Para este ejemplo en particular, hay una función incorporada aún más fácil. Todo lo que tiene que hacer es activar los informes de tiempo de ejecución en ZSH y lo hará automáticamente.
En una aplicación más práctica de
preexec()
, lo uso ver si el shell se ejecuta dentro detmux
oscreen
y, si es así, para enviar información sobre el comando de aguas arriba está ejecutando actualmente para que se muestre en el nombre de la ficha.Desafortunadamente en bash este pequeño mecanismo no existe. Aquí está el intento de un hombre de replicarlo . También vea la respuesta de Gilles para un pequeño truco ingenioso similar.
fuente
La forma más fácil probablemente sería establecer
PROMPT_COMMAND
. Ver Variables de Bash :Por ejemplo, para evitar sobrescribir cualquier comando de solicitud existente, puede hacer lo siguiente:
fuente
csh
/tcsh
tiene el mejor soporte para esta función (y siempre la ha tenido).En otras palabras,
set time=1
imprimirá el tiempo consumido (sistema, usuario, transcurrido) por cualquier comando que tomó más de 1 segundo de tiempo de CPU. Plainset time
permitirá imprimir la hora de todos los comandos.fuente