A execução do comando time produz uma saída completamente diferente quando executada com bom

3

Na minha caixa Ubuntu carregada, executei nice -n 19 time echo e obtive a seguinte saída:

0.00user 0.00system 0:02.80elapsed 0%CPU (0avgtext+0avgdata 1732maxresident)k
312inputs+0outputs (1major+74minor)pagefaults 0swaps

No entanto, quando executo time echo , obtenho a seguinte saída:

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

Ainda mais estranho, quando eu corro nice -n 19 time time eu recebo:

Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--quiet] [--help] command [arg...]
Command exited with non-zero status 1
0.00user 0.00system 0:03.29elapsed 0%CPU (0avgtext+0avgdata 1344maxresident)k
0inputs+0outputs (0major+67minor)pagefaults 0swaps

Mas quando executo o time time , acabo de receber:

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

Por que recebo saídas diferentes quando executo time com nice ? Originalmente, pensei que apenas produziria um valor mais alto (por exemplo, real não seria 0,000s), mas parece que o comando nice altera o comando time .

    
por alexy13 10.12.2017 / 07:43

3 respostas

4

TL; DR: Use type para verificar se o comando é um shell embutido. Você está usando time do bash em time xyz e /usr/bin/time em nice time xyz .

Use type <command> para saber o que seu shell usa:

$ type time
time is a shell keyword

Em bash time é uma palavra-chave do shell. Não é o comando time (que pode ser encontrado em which time ). Vários comandos têm palavras-chave de shell internas no bash, por exemplo, echo , test , pwd e outras:

$ type echo test pwd nice time
echo is a shell builtin
test is a shell builtin
pwd is a shell builtin
nice is /usr/bin/nice
time is a shell keyword

Observe que man retornará a documentação incorreta nesse caso. Você precisa de help para os comandos do shell:

$ 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

    The value of the TIMEFORMAT variable is used as the output format.

    Exit Status:
    The return status is the return status of PIPELINE.
O manual do time contém uma sugestão, a propósito:

$ man time

TIME(1)                 General Commands Manual                TIME(1)

NAME
       time - run programs and summarize system resource usage

SYNOPSIS
       time   [ -apqvV ] [ -f FORMAT ] [ -o FILE ]
              [ --append ] [ --verbose ] [ --quiet ] [ --portability ]
              [ --format=FORMAT ] [ --output=FILE ] [ --version ]
              [ --help ] COMMAND [ ARGS ]

DESCRIPTION
       time run the program COMMAND with any given arguments ARG....
       When COMMAND finishes, time displays information about
       resources used by COMMAND (on the standard error output, by
       default).  If COMMAND exits with non-zero status, time displays
       a warning message and the exit status.

       ...

EXAMPLES
       ...

       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

Referências:

por 10.12.2017 / 08:59
2

Existem dois comandos time disponíveis. Um é embutido no shell e o outro é um executável no sistema de arquivos. Como você descobriu, eles têm diferentes formatos de saída. nice não pode executar o que está embutido no shell, então ele executa o outro.

    
por 10.12.2017 / 07:53
1

Executar

time nice command ...

para usar o time incorporado ao shell .

Ou se você quiser tempo todo um pipeline (que é praticamente o ponto de ter um time embutido no shell), você precisa fazer

time nice bash -c 'some cmd... | other cmd...'

para que o nice se aplique ao pipeline inteiro.

    
por 10.12.2017 / 11:17

Tags