A maneira típica de fazer isso não é apagar um único caractere, mas voltar ao início da linha usando um retorno de carro ( \r
):
printf "89%%"; sleep 1; printf "\r90%%\n"
Observe que isso não limpa a linha, então você precisa cuidar disso, se necessário. Opções simples estão adicionando espaços ao final, ou fazendo a largura fixa da saída (por exemplo, printf "%2d%%\n" 1
fornece um espaço à esquerda).
Existem saídas de terminal que permitem mover e limpar partes da tela, as seqüências CSI , mas eles são dependentes do terminal (embora na prática os escopos VT100 sejam suportados em todos os lugares agora). Por exemplo
printf "89%%"; sleep 1; printf "\e[3D90%%\n"
usa ␛[3D
para mover três caracteres para a esquerda e escreve sobre eles (assumindo que printf
suporta \e
);
printf "89%% hello"; sleep 1; printf "\e[0E\e[K90%%\n"
usa ␛[0E
para passar para o início da linha atual e ␛[K
para limpar até o final da linha (supondo que seu terminal suporte essas sequências).
tput
fornece uma maneira de terminal e printf
de acessando estas seqüências:
printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%\n"
moverá o cursor para a esquerda três vezes ( cub 3
) e passará para o final da linha ( el
), usando qualquer sequência de caracteres apropriada para o terminal atual;
printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%\n"
moverá o cursor para a coluna mais à esquerda ( hpa 0
) e passará para o final da linha.
man terminfo
dirá o que é "nome do recurso" para usar com tput
.
(Observe que muitas das especificidades dos exemplos acima presumem que todas as suas saídas estão na mesma linha. Elas não devem ser à prova de erros, apenas para ilustrar várias abordagens.)
Para um controle de tela similar em scripts PHP, você pode olhar para a extensão ncurses
do PECL.