Como eu uso $ SECONDS dentro de um script bash?

4

Eu quero salvar o resultado do comando $SECONDS em uma variável, para imprimir o tempo no formato HH:MM:SS .

Isso é o que eu tentei até agora. Tentei imprimi-lo de maneiras diferentes e estava sempre obtendo o resultado como 0 :

time_spent="$SECONDS"
echo "Time: $time_spent"

Eu quero imprimir o tempo gasto no shell quando fecho o meu console. Eu criei um script que é executado toda vez que o console foi fechado.

    
por Andrew 27.04.2018 / 21:08

4 respostas

7

Para obter $SECONDS no formato HH: MM: SS, você precisará fazer uma matemática (inteira):

hrs=$(( SECONDS/3600 )); mins=$(( (SECONDS-hrs*3600)/60)); secs=$(( SECONDS-hrs*3600-mins*60 ))

printf 'Time spent: %02d:%02d:%02d\n' $hrs $mins $secs
Time spent: 431:48:03
    
por steeldriver 27.04.2018 / 21:26
5

Você referenciou a variável interna bash SECONDS (que gera o número de segundos decorridos desde que a instância atual do shell foi invocada) e salvou o valor como outra variável time_spent . Agora, depois disso toda vez que você verificar o valor da variável time_spent , você obterá o mesmo valor - o salvo, no momento da expansão de SECONDS .

Para obter dinamicamente SECONDS , você deve referenciar $SECONDS diretamente, em vez de usar uma variável intermediária:

echo "Time: $SECONDS"

Se você insistir em usar uma variável intermediária, certifique-se de fazer a expansão de $SECONDS a cada vez.

Em relação ao valor de SECONDS sendo 0 , você pode facilmente reproduzir isso:

% bash -c 'echo $SECONDS'
0

O ponto é: quando você está calculando o valor, ainda não é um segundo, então o valor está sendo 0 , corretamente.

    
por heemayl 27.04.2018 / 21:16
4

Aqui está um rápido que dá horas, minutos e segundos desde que o shell foi aberto:

~$ cat how_long_open 
#!/bin/bash

time=$SECONDS
printf '%dh:%dm:%ds\n' $(($time/3600)) $(($time%3600/60)) $(($time%60))

Como os scripts são executados em um subshell, a melhor maneira de obter saída é utilizar o script em vez de chamá-lo.

Exemplos:

Sem pesquisar o script

~$ ./how_long_open 
0h:0m:0s

Com o fornecimento do script

~$ source ./how_long_open 
1h:24m:40s

Espero que isso ajude!

    
por Terrance 27.04.2018 / 22:59
4

Se tiver certeza de que $SECONDS será menor que 1 dia (ou seja, 86400 segundos), então GNU core-utils date faz um ótimo trabalho com a formatação requerida:

$ date -ud "@$SECONDS" "+Time elapsed: %H:%M:%S"
Time elapsed: 00:32:05
$
    
por Digital Trauma 27.04.2018 / 23:22