expanda aliases antes de chamar / usr / bin / time

5

Quando eu uso o shell embutido time , posso passar qualquer comando que eu passaria para o shell sem time . Mas quando eu uso o /usr/bin/time externo, não posso passar um alias de shell, porque /usr/bin/time naturalmente não está ciente disso:

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

Como posso convencer o shell a expandir o alias para ll antes 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 aliases.

Meu motivo para usar /usr/bin/time é medir o pico de uso de memória .

    
por gerrit 27.09.2016 / 13:58

2 respostas

2

Você pode definir um alias para /usr/bin/time como:

alias 'ubtime=/usr/bin/time '

Ou

alias 'ubtime=command time '

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

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

ubtime ll

Será realmente expandido para

/usr/bin/time ls -l

(assumindo que ll é um alias para ls -l ).

Em qualquer caso, /usr/bin/time sendo um executável autônomo, ele não pode sincronizar pipelines ou compor comandos ou funções ou shell embutidos, portanto, não pode cronometrar a expansão de aliases arbitrários.

Se o motivo do uso de /usr/bin/time for porque você prefere o formato de saída padrão em relação ao do trabalho de chave time , 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]

(o \e[31;m para saída colorida (negrito e vermelha)).

    
por 27.09.2016 / 16:19
0

Isso pode funcionar no bash:

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

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

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

Se os aliases estiverem definidos nos arquivos de configuração do bash e se você não se importar com a sobrecarga cronometrada, tente

/usr/bin/time bash -l -i -c "ll"
    
por 27.09.2016 / 15:50