expandir alias antes de llamar a /usr/bin/time

expandir alias antes de llamar a /usr/bin/time

Cuando uso el shell incorporado time, puedo pasar cualquier comando sin el cual pasaría al shell time. Pero cuando uso external /usr/bin/time, no puedo pasar un alias de shell porque, /usr/bin/timenaturalmente, no los conozco:

$ /usr/bin/time ll
/usr/bin/time: cannot run ll: No such file or directory

¿Cómo puedo convencer al Shell para que expanda el alias llantes de pasárselo /usr/bin/time? Analizar la salida de alias lles complicado, en particular porque la definición del alias contiene otros alias.


Mi razón para usar /usr/bin/timees para medir.uso máximo de memoria.

Respuesta1

Puede definir un alias /usr/bin/timecomo:

alias 'ubtime=/usr/bin/time '

O

alias 'ubtime=command time '

si no desea codificar la ruta al timeejecutable.

El truco está en el espacio final en la definición de alias que le dice al shell que los alias deben sustituirse después de ese alias para que

ubtime ll

De hecho, se ampliará a

/usr/bin/time ls -l

(suponiendo llque sea un alias de ls -l).

En cualquier caso, /usr/bin/timeal ser un ejecutable independiente, no puede cronometrar canalizaciones ni comandos o funciones compuestas ni componentes integrados del shell, por lo que no puede cronometrar la expansión de alias arbitrarios.

Si el motivo del uso /usr/bin/timees porque prefiere su formato de salida predeterminado al de las timeteclas, tenga en cuenta que en muchos shells, el formato se puede modificar. Por ejemplo, en zsh:

$ TIMEFMT=$'\e[31;1m%J\e[m: U:%U S:%S (%*E total) [avgtext:%X avgdata:%D maxmem:%M]'
$ time ls -l | head -n1
total 288072444
ls -l: U:0.00s S:0.01s (0.017 total) [avgtext:0 avgdata:0 maxmem:3]
head -n1: U:0.00s S:0.00s (0.015 total) [avgtext:0 avgdata:0 maxmem:3]

( \e[31;1mpara salida en color (rojo negrita)).

Respuesta2

Esto puede funcionar en bash:

/usr/bin/time  $(alias "ll" | sed "s/^alias [^=]*='\(.*\)'/\1/")

pero aún no es completamente seguro para alias arbitrarios, con respecto a espacios, caracteres de escape, alias y funciones anidados, etc.

Supongo que no existe una solución que no sea fea. Es por eso que los shells tienen un archivo time. Incluso si la expansión de alias fuera más fácil, el siguiente problema sería cómo cronometrar las funciones. Tenga en cuenta que los alias pueden incluso utilizar funciones de shell.

Si sus alias están definidos en los archivos de configuración de bash y si no le importa la sobrecarga cronometrada, puede intentar

/usr/bin/time bash -l -i -c "ll"

información relacionada