Por que o comando `time` não funciona com nenhuma opção?


61

Tentei usar o timecomando com a -fopção para formatar a saída do tempo, mas recebo o seguinte erro:

-f: command not found

Então eu tentei usar outras opções -a, -oetc, e eu recebo o mesmo erro. Nem mesmo time --versionnão funciona ( --version: command not found).

Não me diga para ler o homem, porque já o faço muitas vezes ... Todas essas opções são especificadas lá. Então, onde poderia estar o problema?


Será que sudo apt-get install --reinstall timeajuda?
Jobin

9
Ou talvez a concha interna timecom/usr/bin/time
Rmano 14/03

Respostas:


91

Bem, mesmo que você não goste, vou fazer você ler novamente com mais atenção man time. No final da EXAMPLESseção, você encontrará:

  Users of the bash shell need to use an explicit path in order to run
  the external time command and not the shell builtin variant.  On system
  where time is installed in /usr/bin, the first example would become
       /usr/bin/time wc /etc/hosts

Então, suponho que você use o bash shell, que usa uma versão interna time, fornecida como uma palavra-chave shell. Você pode verificar isso usando o seguinte comando:

type time

e a saída provavelmente será:

time is a shell keyword

Se este for o caso, então é claro, para usar o real time comando, você deve usar o seu caminho explícito: /usr/bin/time.

Além disso, se você não quiser mais usar a palavra-chave shell time, poderá criar um alias permanente da seguinte maneira:

alias time='/usr/bin/time'

Isso substituirá a palavra-chave shell timeporque o comando:

type time

dará a seguinte saída agora:

time is aliased to `/usr/bin/time'

5
para os comandos criados pelo shell: {info time} e {type time}. Para os comandos binários: {time time} e {man time} #
Michael Martinez

@ Michael info timeé sobre o binário. help timeé sobre o builtin.
wjandrea

sim, desculpe, eu estava pensando em "ajuda", mas saiu "info"
Michael Martinez

21

Como, como as outras respostas explicam, timeé uma palavra-chave shell, a única opção disponível para você é -p:

terdon@oregano ~ $ help time
time: time [-p] pipeline
    Report time consumed by pipeline's execution.

Execute PIPELINE and print a summary of the real time, user CPU time,
and system CPU time spent executing PIPELINE when it terminates.

Options:
  -p    print the timing summary in the portable Posix format

Então, você precisa executar o timeque está em /usr/bin. Aqui estão algumas maneiras de fazer isso:

  • Use o timeexecutável:

    /usr/bin/time -f %Uuser ls >/dev/null
  • Use o \que faz com que seu shell ignore aliases e palavras-chave e, em vez disso, procure $PATHum executável correspondente:

    \time -f %Uuser ls >/dev/null 
  • Use o commandbuilt-in que tem um efeito semelhante:

    command time -f %Uuser ls >/dev/null
  • Use um shell diferente, que não possua tal palavra-chave. Por exemplo sh(que atualmente está dashno Ubuntu):

    sh -c "time -f %Uuser ls >/dev/null"
  • Use which, que irá pesquisar no seu $PATH(OK, este é bobo):

    $(which time) -f %Uuser ls >/dev/null

Existe uma maneira de fazer o oposto - replicar embutido timecom regularidade /usr/bin/time? Ou seja, para traduzir o script bash em traço.
Dan M.

@DanM. Eu não entendo Se você quiser o builtin time, execute time. Se você deseja que o executável autônomo, execute /usr/bin/time.
terdon

não há nenhum built-in timeno shell padrão do Ubuntu, até onde eu saiba. Quero traduzir o script usando o built-in para o autônomo com o mesmo comportamento.
Dan M.

@DanM. então é só usar time. Ele chamará o que estiver disponível. Esse será o builtin para bash e o autônomo para dash. Se você usar /usr/bin/time, ele sempre chamará o autônomo, tanto no bash quanto no dash. Mas parece que você provavelmente deveria estar fazendo uma nova pergunta, explicando o comportamento que precisa. Deixe-me saber se você faz e eu vou tentar ajudar.
terdon

Sim, mas interno e autônomo têm sintaxe / semântica drasticamente diferentes. De qualquer forma, obrigado. Farei uma nova pergunta se não descobrir como lidar com isso sozinha.
Dan M.

17

As conchas bashe zshtêm seu timecomando interno . Você tem que usar

/usr/bin/time -f ...

BTW, eu descobri que usando (de zsh):

~% which  time
time: shell reserved word
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.