Você mesmo escreveu, como
[2K
Dependendo do seu terminal, ele entenderá isso como uma instrução para executar alguma ação. Desde que você mencionou "console", você pode consultar a página console_codes(4)
man, onde está listado:
ECMA-48 CSI sequences
CSI
(or ESC [
) is followed by a sequence of parameters, at most NPAR (16), that are decimal numbers separated by semicolons. An empty or absent parameter is taken to be 0. The sequence of parameters may be preceded by a single question mark.
...
K
: EL - Erase line
default: from cursor to end of line.
ESC [ 1 K
: erase from start of line to cursor.
ESC [ 2 K
: erase whole line.
(É bom lembrar que 3
é o mesmo que ESC
).
Portanto, sua sequência de escape é o comando "apagar toda a linha" para este terminal.
A forma portátil (e mais clara) de escrever isso seria
clear_line='tput cr; tput el'
printf "${clear_line}%3d Days, %02d:%02d:%02d" $days $hours $mins $secs
Usar tput
significa que, ao gravar em um terminal que não suporta a ação el
, ou que a suporta com uma sequência de escape diferente, você obterá a saída apropriada em vez do lixo ininteligível.
P.S. Toda essa aritmética é provavelmente desnecessária, assumindo o GNU date
. Se você nunca exceder 7 dias, você pode baixá-lo para
date -u -d "-$begin seconds +3days" '+${clear_line}%w days, %T'
Caso contrário, você ainda precisa calcular $days
, mas pode formatar os segundos com %T
:
now=$(date +%s)
diff=$(($now - $begin))
days=$(($diff / 86400))
date -u -d "00:00 $diff seconds" '+${clear_line}$days days, %T'