use time
:
$ time longrunningcommand --takeyourtime
time
executará o restante da linha de comando como um comando (neste exemplo, longrunningcommand --takeyourtime
) e, quando o comando estiver concluído, imprimirá o tempo decorrido.
outro exemplo: time foo --bar
executará foo --bar
e aguardará a conclusão e, em seguida, imprimirá o tempo decorrido.
time
é um comando embutido na maioria dos shells. a diferença do shell embutido e do comando do sistema é principalmente o formato da saída. veja abaixo para mais detalhes sobre as diferenças.
se você quiser usar o sistema time
, faça assim:
$ /usr/bin/time longrunningcommand --getsomecoffee
ou assim:
$ \time longrunningcommand --callmom
$ command time longrunningcommand --callmom
a barra invertida funciona no bash e talvez em algumas outras shells. command
funciona na maioria dos shells.
exemplos mais elaborados
exemplo longrunningcommand
:
#!/bin/sh
echosleep() {
seq $1 | while read tick; do
echo $tick
sleep 1
done
echo done
}
case $1 in
--takeyourtime) echosleep 4 ;;
--getsomecoffee) echosleep 5 ;;
--callmom) echosleep 6 ;;
*) echo wat ;;
esac
invocação de exemplo:
$ ./longrunningcommand --takeyourtime
1
2
3
4
done
(com atraso entre cada linha de saída)
invocação de exemplo usando bash builtin time
:
$ time ./longrunningcommand --getsomecoffee
1
2
3
4
5
done
real 0m5,020s
user 0m0,010s
sys 0m0,010s
as informações interessantes são real 0m5,020s
. Para obter mais informações sobre os outros números, consulte: link
invocação de exemplo usando o sistema time
:
$ \time ./longrunningcommand --callmom
1
2
3
4
5
6
done
0.00user 0.01system 0:06.02elapsed 0%CPU (0avgtext+0avgdata 3656maxresident)k
0inputs+0outputs (0major+1089minor)pagefaults 0swaps
as informações interessantes são 0:06.02elapsed
. para o significado dos outros números, leia a página de manual do time
: link
você pode alterar a saída do sistema time
. observe:
$ \time sleep 0.5
0.00user 0.00system 0:00.50elapsed 0%CPU (0avgtext+0avgdata 2376maxresident)k
0inputs+0outputs (0major+81minor)pagefaults 0swaps
$ \time -p sleep 0.5
real 0.50
user 0.00
sys 0.00
$ \time -f %E sleep 0.5
0:00.50
como redirecionar ou capturar a saída
para demonstração, observe o comando hellostdoutstderr
:
#!/bin/sh
sleep 0.5
echo stdout
echo stderr >&2
invocações de exemplo:
$ ./hellostdoutstderr
stdout
stderr
$ ./hellostdoutstderr >stdout 2>stderr
$ cat stdout
stdout
$ cat stderr
stderr
o bash builtin time
imprime o terminal mesmo que stdout e stderr sejam redirecionados porque ele é construído e pode fazer o que quiser (no shell)
$ time ./hellostdoutstderr >stdout 2>stderr
real 0m0,511s
user 0m0,005s
sys 0m0,006s
para ainda redirecionar essa saída, leia aqui:
ou aqui: link
o sistema time
imprime para stderr como deveria
$ \time ./hellostdoutstderr >stdout 2>stderr
$ cat stdout
stdout
$ cat stderr
stderr
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3672maxresident)k
0inputs+16outputs (0major+311minor)pagefaults 0swaps
você pode dizer a time
para imprimir em um arquivo separado
$ \time -o timeout ./hellostdoutstderr >stdout 2>stderr
$ cat stderr
stderr
$ cat timeout
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3676maxresident)k
0inputs+16outputs (0major+309minor)pagefaults 0swaps