Por que o formato de saída do tempo varia dependendo de como eu o chamo

Por que o formato de saída do tempo varia dependendo de como eu o chamo

Pode ser uma pergunta de novato, mas não entendo como isso está configurado e por que o formato de saída do timecomando é diferente nestes dois casos:

se usado via time, a saída será de três linhas com informações básicas

$ time sleep 1

real    0m1.003s
user    0m0.000s
sys     0m0.000s

então posso verificar qual binário é usado

$ which time
/usr/bin/time

e chame-o diretamente para obter a saída em um formato completamente diferente, com muito mais informações

$ /usr/bin/time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 2000maxresident)k
0inputs+0outputs (0major+77minor)pagefaults 0swaps

não há aliases relacionados atime

$ alias | grep time
$ 

Estou correndo Ubuntu 16.04.

Responder1

A primeira é a bashpalavra-chave interna do próprio time(compilada com bash), e a segunda é o executável externo time( /usr/bin/time, vem com o timepacote).

Além disso, whichnão é possível mostrar os comandos ou palavras-chave internos do shell, pois ele apenas pesquisa PATH, você precisa usar typepara isso. Sendo um shell embutido, você typetambém pode verificar as entidades internas do shell (e também PATH), para que você possa identificar a diferença:

type -a time

Aqui:

$ type -a time
time is a shell keyword
time is /usr/bin/time

O primeiro será executado se você apenas usar time. Você também pode obter o que está sendo executado apenas usando type(sem -a):

type time

Diz para pesquisar nas entidades internas do shell e também, ou -aseja , pesquisar em todas as fontes possíveis.typePATH

Se por algum motivo você precisar do externo, use qualquer um dos seguintes:

\time
"time"
'time'
command time

Responder2

Outra diferença entre os utilitários internos e externos é que os utilitários internos do Bashtime cronometrará pipelines completosou chamadas para funções shell (aparentemente até loops, mas o manual não parece prometer isso). O externo timenão pode, por estar fora do shell, não conhecer o código ao redor.

bash$ time echo blah | sleep 3
real    0m3.002s
...
bash$ /usr/bin/time echo blah | sleep 3
0.00user 0.00system 0:00.00elapsed ?%CPU 
...
bash$ time for x in 1 2 3 ; do sleep 1 ; done
real    0m3.006s
...

Enquanto o tempo éEspecificadasno padrão, não é especificado como deve agir em um pipeline, portanto, uma implementação interna mais poderosa como essa é possível.

informação relacionada