O tempo do Bash se comporta estranho

1

Por que isso não funciona?

$ time sleep 1 2>&1 | grep real

real    0m1.003s
user    0m0.007s
sys 0m0.001s

$ ofile=time.out
$ for x in {1..2}; do time sleep 1 ${x}> ${ofile} && test -s ${ofile} && echo '## OK' || echo '## NOK'; done

real    0m2.002s
user    0m0.002s
sys 0m0.000s
## NOK

real    0m3.002s
user    0m0.002s
sys 0m0.000s
## NOK

De acordo com man time :

When command finishes, time writes a message to standard error giving timing statistics about this program run.

Onde eu entendi errado? Também parece estranho que a cada tempo de iteração cresça?

$ command -V time
time is a shell keyword

$ echo $SHELL
/bin/bash

$ bash --version
GNU bash, version 4.4.12(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

EDITAR

Eu tentei o que foi sugerido nos comentários:

$ command time sleep 1
bash: time: command not found

Também testei no sistema Debian9:

$ command -V time 
time is a shell keyword

$ command time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 1844maxresident)k
0inputs+0outputs (0major+76minor)pagefaults 0swaps

$ time sleep 1 |& grep real

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

$ bash --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
    
por NarūnasK 25.08.2017 / 00:51

1 resposta

4

Seu comando time sleep 1 ${x} executa efetivamente time sleep 1 1 e, em seguida, time sleep 1 2 .

O comando bash builtin time pega esses dois valores e dorme para os dois.

Portanto, sleep 1 1 é o mesmo que sleep 2 e sleep 1 2 é o mesmo que sleep 3 .

Com o comando time incorporado, as coisas não funcionam da mesma maneira que o normal e, portanto, time sleep 2>... é interpretado mais próximo de time ( sleep 2>...) .

Então, ao invés disso

( time sleep 1 ) 2>&1 | grep real
    
por 25.08.2017 / 01:47

Tags