Imprime algo no console no mesmo lugar do eco anterior, com uma espécie de eco negativo

6

No bash, você pode converter um comando chamado clear para limpar todos os comandos da tela.

E com echo , você pode imprimir o que quiser na tela.

Em meus scripts simples, muitas vezes tenho a necessidade de imprimir uma porcentagem do que está sendo feito com meus comandos.

Então eu poderia fazer algo como ...

echo "89%"
echo "90%"
echo "91%"

e assim por diante.

o que eu odeio é fazer com que a tela fique cheia de atualizações por cento ...

89%
90%
91%
...

eu gostaria de saber se há uma combinação especial de caracteres (por exemplo, "\ 033 [01; 31m") que pode ser reproduzida com bash ou php echo e informa ao console "remover o último caractere impresso anterior. "

fazendo isso usando algo como: (exemplo php)

echo str_repeat($neg_character, strlen($last_percentage_update_string));
echo $new_percentage_update_string;

Eu teria a nova seqüência impressa na posição exata da anterior sem ter a tela cheia de linhas

Caso contrário, eu procuro uma abordagem para fazer o mesmo de outras maneiras sempre usando scripts bash e php (por favor, inclua exemplos de trabalho reais, pelo menos, com um console debian9 e php7)

    
por user3450548 23.08.2018 / 12:14

1 resposta

17

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.

    
por 23.08.2018 / 12:16