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/time
naturalmente, 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 ll
antes de pasárselo /usr/bin/time
? Analizar la salida de alias ll
es complicado, en particular porque la definición del alias contiene otros alias.
Mi razón para usar /usr/bin/time
es para medir.uso máximo de memoria.
Respuesta1
Puede definir un alias /usr/bin/time
como:
alias 'ubtime=/usr/bin/time '
O
alias 'ubtime=command time '
si no desea codificar la ruta al time
ejecutable.
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 ll
que sea un alias de ls -l
).
En cualquier caso, /usr/bin/time
al 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/time
es porque prefiere su formato de salida predeterminado al de las time
teclas, 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;1m
para 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"