expanda os aliases antes de chamar /usr/bin/time

expanda os aliases antes de chamar /usr/bin/time

Quando uso o shell embutido time, posso passar qualquer comando que passaria para o shell sem o time. Mas quando uso o external /usr/bin/time, não consigo passar um alias de shell, porque /usr/bin/timenaturalmente não estou ciente deles:

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

Como posso convencer o shell a expandir o alias llantes de passá-lo para /usr/bin/time? Analisar a saída de alias llé complicado, principalmente porque a definição do alias contém outros alias.


Minha razão para usar /usr/bin/timeé medirpico de uso de memória.

Responder1

Você pode definir um alias para /usr/bin/timecomo:

alias 'ubtime=/usr/bin/time '

Ou

alias 'ubtime=command time '

se você não quiser codificar o caminho para o timeexecutável.

O truque está no espaço final na definição do alias que informa ao shell que os aliases devem ser substituídos após esse alias para que

ubtime ll

Na verdade, será expandido para

/usr/bin/time ls -l

(assumindo llque é um alias para ls -l).

Em qualquer caso, /usr/bin/timesendo um executável independente, ele não pode cronometrar pipelines ou comandos ou funções compostos ou componentes internos do shell, portanto, não pode cronometrar a expansão de aliases arbitrários.

Se o motivo do uso /usr/bin/timefor porque você prefere o formato de saída padrão ao do timekeywork, observe que em muitos shells, o formato pode ser modificado. Por exemplo, em 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 saída colorida (negrito vermelho)).

Responder2

Isso pode funcionar no bash:

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

mas ainda não é totalmente seguro para aliases arbitrários, em relação a espaços, caracteres de escape, aliases e funções aninhados, etc.

Eu acho que não há solução não feia possível. É por isso que os shells têm um arquivo time. Mesmo que a expansão do alias fosse mais fácil, o próximo problema seria como cronometrar as funções. Observe que os aliases podem até usar funções shell.

Se seus aliases estiverem definidos nos arquivos de configuração do bash e se você não se importa com a sobrecarga cronometrada, você pode tentar

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

informação relacionada