Un comando antes de cada comando bash

18

¿Alguien sabe un medio de poner un comando 'time' antes de cada comando en una sesión bash?

jthoenes
fuente
1
entonces ... ¿quieres anteponer automáticamente 'tiempo' a cada línea de comando?
Quack Quijote
1
sí, por supuesto ... por mesuaramento de rendimiento obviamente
jthoenes

Respuestas:

37

Perdón por la respuesta incorrecta antes, entendí mal su pregunta.

Para agregar el tiempo antes de cada comando que ejecute en el shell, puede hacer algo como esto

bind 'RETURN: "\e[1~time \e[4~\n"'

Esto volverá a vincular la clave de retorno. Ahora, cada vez que presione Intro en lugar de escribir una nueva línea \ n irá al principio de la línea, ingrese el texto 'tiempo' y un espacio, vaya al final de la línea e ingrese la nueva línea \ n produciendo así el deseado efecto.

Si no desea sacrificar su tecla Intro, puede hacer una 'segunda' tecla de entrada de referencia como F12 vinculando el comando de esta manera

bind '"\e[24~": "\e[1~time \e[4~\n"'

Ahora, en lugar de reemplazar la tecla de retorno, vincula F12.

El trasfondo de todo esto es que bash usa la línea de lectura de GNU para leer comandos. Entonces readline sería un buen punto de partida para una mayor manipulación de comandos, etc.

Lukas Loesche
fuente
1
+1 buena solución! Me gusta la idea de tener una tecla enter de referencia separada de la tecla enter normal.
quack quijote
Esa es una idea inteligente. ¿Cómo puede generalizarlo para ejecutar una función definida por el usuario antes de cada comando? No sé cómo combinar el código bash y una función readline en el mismo enlace.
Gilles 'SO- deja de ser malvado'
¿Esto no se ejecutará en Mac? Ejecuté el comando en la terminal y mi tecla enter no parece hacer nada ahora.
akki
6

Me doy cuenta de que esto está fuera del alcance de esta pregunta, pero ...

En zsh(que, que yo sepa, es un super conjunto de bash) si configura la siguiente variable en su .zshrcarchivo:

export REPORTTIME=5

Cada comando que demore más de 5 segundos (estoy bastante seguro) mostrará la salida de time. Todos los comandos que se completan más rápidamente no lo hacen. Y en esos casos a uno realmente no le importa, por lo que es bueno no desordenar las cosas. También hay muchas otras características interesantes zshque puedes disfrutar mientras lo haces.

Tychoish
fuente
Buen consejo. Si bien zsh seguramente tiene un superconjunto de la funcionalidad de bash , su sintaxis no es un superconjunto de la sintaxis de bash , por lo que no es un reemplazo "directo".
Chris Johnsen
1

Incluya \ t en su cadena de solicitud. Incluirá el tiempo en su solicitud en el punto donde lo incluya. Ver: http://www.ibm.com/developerworks/linux/library/l-tip-prompt/

JRobert
fuente
Esa es la hora actual en el momento en que se genera la solicitud, no el tiempo que llevó ejecutar el comando anterior.
Pausado hasta nuevo aviso.
Cierto; y la diferencia entre eso y la hora actual del próximo indicador es el tiempo de ejecución (menos el tiempo de escritura, por supuesto, pegar es tu amigo aquí). No se necesitan reasignaciones clave.
JRobert
0

PS1 parece ser la forma estándar de hacer algo como esto.

Jason Sundram
fuente
2
Modifica la pantalla, no el comando real ejecutado.
user1686
@grawity Correcto, pero te daría exactamente lo que quieres ... el tiempo que antecede a cada línea.
Jason Sundram
3
Lo cual es completamente diferente de lo que timehace (mide cuánto tiempo tardó en ejecutarse un comando).
user1686
@grawity, creo que tienes razón: tendrías que hacer la resta tú mismo. Parece que @Jrobert tuvo la misma idea.
Jason Sundram