O problema é que mka
é uma função bash exportada pelo seu script e não um executável (em oposição a make
), portanto, /usr/bin/time
não o encontra, pois procura um executável.
Existem duas soluções possíveis.
Primeiro, observe que há uma diferença entre a função interna bash time
e o executável /usr/bin/time
. Estes são comandos diferentes, que tomam parâmetros diferentes e geram saídas diferentes:
$ time sleep 1
real 0m1.001s
user 0m0.000s
sys 0m0.001s
$ /usr/bin/time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 664maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
Digite help time
para obter ajuda para o bash time
embutido. Digite man time
para obter ajuda para o executável /usr/bin/time
.
A primeira solução usa time
, enquanto a segunda solução usa /usr/bin/time
.
Primeira solução: usando a função interna bash time
A função interna bash time
está ciente das funções declaradas do bash, e você pode usá-las imediatamente para medir o tempo de tais funções.
$ foo() {
sleep 1;
echo "Hello World"
}
$ time foo
Hello World
real 0m1.002s
user 0m0.000s
sys 0m0.001s
No seu caso, o seguinte comando deve funcionar:
$ time mka -j8 bacon
Este seria o meu caminho preferido. No entanto, pode não gerar exatamente a saída desejada. Em particular, não mede nem imprime o uso da CPU.
Segunda solução: usando o executável /usr/bin/time
Você não pode medir diretamente o tempo de uma função bash interna usando /usr/bin/time
(até onde eu saiba), mas o que você pode fazer é medir o tempo do executável /bin/bash
executando essa função bash. Isso é um pouco hacky, e gera um pouco de sobrecarga quando você está lançando uma instância extra de bash
. Mas essa sobrecarga pode ser insignificante quando se depara com uma função que leva minutos para ser computada, portanto ela ainda pode atender melhor às suas necessidades.
Para poder executar o executável /bin/bash
em uma função bash, temos que exportar a função primeiro.
$ foo() {
sleep 1;
echo "Hello World"
}
$ export -f foo
$ echo foo | /usr/bin/time /bin/bash
Hello World
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 1476maxresident)k
0inputs+0outputs (0major+707minor)pagefaults 0swaps
Assim, no seu caso, para poder usar /usr/bin/time
e gerar o formato de saída desejado, você pode proceder da seguinte maneira:
$ export -f mka
$ echo 'mka -j8 bacon' | /usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" /bin/bash