Temporizador de contagem regressiva da linha de comando bash do OSX

1

eu encontrei Aqui no superusuário o seguinte script de contagem regressiva que eu poderia incluir no meu .bash_profile:

function countdown(){  
   date1=$((`date +%s` + $1));   
   while [ "$date1" -ne `date +%s` ]; do   
     echo -ne "$(date -u --date @$(($date1 - `date +%s`)) +%H:%M:%S)\r";  
     sleep 0.1  
  done  
}

Não funciona no OSX, eu entendo, por causa das diferenças no date comando. Outro usuário comentou como tal, mas o problema permaneceu não resolvido nessa questão.

O mesmo problema (eu acho) também é discutido e resolvido Aqui mas não consigo descobrir como modificar o script de contagem regressiva para utilizar essa solução.

Tim
fonte

Respostas:

3

Pessoalmente, eu refatorei isso um pouco para a legibilidade (ainda confiando na data do GNU)

function countdown(){  
    local now=$(date +%s)
    local end=$((now + $1))
    while (( now < end )); do   
        printf "%s\r" "$(date -u -d @$((end - now)) +%T)"  
        sleep 0.25  
        now=$(date +%s)
    done  
    echo
}

Mapeamento das chamadas de data para a data do BSD do OSX ( página do homem aqui )

Parece a invocação da data do GNU

date -u -d @$((end - now)) +%T

traduz a esta invocação de data BSD

date -u -j -f %s $((end - now)) +%T

mas isso não foi testado.

glenn jackman
fonte
O Bash está retornando um erro inesperado de EOF na linha printf.
Tim
Tem certeza de que você tem todas as citações correspondentes? O código que publiquei funciona (com a versão bash 4 de qualquer forma)
glenn jackman
minha culpa: uma das minhas aspas duplas era encaracolada (maldita autocorreção ...) O código funciona perfeitamente agora.
Tim
Hora de escolher um editor melhor.
glenn jackman
Você poderia adicionar if (( $# <1 )); then return; fi como a primeira linha para um pouco de robustez.
Burhan Ali