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

14

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

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

$ time sleep 1

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

então eu posso verificar qual binário é usado

$ which time
/usr/bin/time

e ligue 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 a time

$ alias | grep time
$ 

Estou executando Ubuntu 16.04 .

    
por xaxa 31.08.2016 / 22:01

2 respostas

23

O primeiro é a própria palavra-chave interna bash time (compilada com bash ) e a segunda é o executável externo time ( /usr/bin/time , vem com o pacote time ).

Além disso, which não pode mostrar os comandos internos ou as palavras-chave do shell, pois ele apenas pesquisa por PATH , é necessário usar type para isso. Sendo um shell embutido, type pode adicionalmente 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ê usar apenas time . Você também pode obter o que está sendo executado usando apenas type (sem -a ):

type time

O -a diz type para pesquisar nas entidades internas do shell e também em PATH , por exemplo, pesquisar em todas as origens possíveis.

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

\time
"time"
'time'
command time
    
por heemayl 31.08.2016 / 22:04
4

Outra diferença entre os utilitários internos e externos é que o Bash embutido time concluirá o tempo pipelines ou chamadas para funções de shell (aparentemente até loops, mas o manual não parece prometer isso). O time externo não pode, já que estar fora do shell, não sabe sobre o código circundante.

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
...

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

    
por ilkkachu 01.09.2016 / 15:19